This is the entry point for the paper “Measuring the Landscape of Civil War.” In this file, a raw csv file of the events dataset created for the Mau Mau rebellion is loaded and processed.

Load Library

library(MeasuringLandscapeCivilWar)
devtools::load_all()
Loading MeasuringLandscapeCivilWar

# global_loads()
knitr::opts_knit$set(progress = TRUE, verbose = TRUE)
knitr::opts_chunk$set(fig.width = 12, fig.height = 8, warning = FALSE, message = FALSE, cache = TRUE)
options(width = 160)
events <- prep_events(fromscratch = F)

Dates

Basic cleaning. Generaly format is DD.MM.YYYY Sometimes multiple days are included by DD1/DD2/MM/YY. Somtimes year is YY or YYYY. -Your plots seem to suggest that there are a number of typos in the dates. All dates should range between 1951-1961.

#p_load(date)
events$event_date_clean <- events$event_date %>%
                           str_replace_all("[[:digit:]]+/", "") %>% #strip off extra day at the front 01/02.12.1950
                           str_replace_all("\\.", "/")          %>% #Convert periods to slashes
                           trimws()                             %>% #trim whitespace
                           str_replace_all("/52", "/1952")      %>% #convert 2 digit years to 4 digit years
                           str_replace_all("/53", "/1953")      %>% #convert 2 digit years to 4 digit years
                           str_replace_all("/54", "/1954")      %>% #convert 2 digit years to 4 digit years
                           str_replace_all("/55", "/1955")      %>% #convert 2 digit years to 4 digit years
                           str_replace_all("/56", "/1956")      %>% #convert 2 digit years to 4 digit years
                           str_replace_all("/19524", "/1954")   %>% #clean typo
                           dmy()                                    #Feed to lubridate
 67 failed to parse.
events %>% filter(is.na(event_date_clean)) %>% dplyr::select(starts_with("event_date")) %>% distinct() %>% print(n=40) #visualize errors
events$event_date_clean_year <- year(events$event_date_clean)
events$event_date_clean_year %>% tabyl() %>% round(3)

How often are event dates missing?

table(events$event_date=="")

FALSE 
 7946 

The documents also have dates, sometimes spanning a period of time. Can use that to nail down missing dates.

(events$document_date_type <- events$document_date %>% 
                             tolower() %>% 
                             mosaic::derivedFactor(
                                          "unknown" = T,
                                          "missing"     = str_detect(.,"obscured|missing|illegible|xx|Document missing"),
                                          "on the"      = str_detect(.,"on the"),
                                          "to"          = str_detect(.," to"),
                                          "for"         = str_detect(.,"For "),
                                          "week"        = str_detect(.,"week"),
                                          "week ending" = str_detect(.,"week ending"),
                                          "period"      = str_detect(.,"period"),
                                          "fortnight"   = str_detect(.,"fortnight"),
                                          "ending"      = str_detect(.,"ending"),
                                          .method = "last",
                                          .default = "unknown"
                            ) 
 ) %>% tabyl() 
events$document_date_clean <- events$document_date %>% tolower() %>% 
                             str_replace_all("Fortnight Ended |period|week ending|for |the |fortnight |ending |week |From |on ","") %>%
                             str_replace_all("[Digits]*th|[Digits]*st|[Digits]*rd|[Digits]*nd","")
events <- events %>% 
         dplyr::select(-one_of("document_date_1","document_date_2")) %>%  #separate will continue to add columns every time its run
                              separate(col=document_date_clean,
                                        into=c("document_date_1","document_date_2"),
                                        sep = " to|to |To | - ", remove=F, extra="drop", fill="right")
events$document_date_clean_1 <- events$document_date_1 %>% 
                                 str_replace_all("[[:digit:]]+/", "")   %>% #strip off extra day at the front 01/02.12.1950
                                 str_replace_all("\\.", "/")             %>% #Convert periods to slashes
                                 trimws() %>%                            
                                 dmy()
 2696 failed to parse.
events$document_date_clean_2 <- events$document_date_2 %>% 
                                 str_replace_all("[[:digit:]]+/", "")   %>% #strip off extra day at the front 01/02.12.1950
                                 str_replace_all("\\.", "/")             %>% #Convert periods to slashes
                                 trimws() %>%                            
                                 dmy()    
 400 failed to parse.
events %>% filter(is.na(document_date_clean_1)) %>% dplyr::select(starts_with("document_date")) %>% distinct() %>% print(n=40) #visualize errors
parse_date_time(c("2016", "2016-04"), orders = c("Y", "Ym"))
[1] "2016-01-01 UTC" "2016-04-01 UTC"
parse_date_time(c("2016", "jan-55"), orders = c("Y", "Ym","bY"))
 1 failed to parse.
[1] "2016-01-01 UTC" NA              
parse_date_time("1904-jan", "yb") #ok so there are jan-54 that don't parse, there are 25 march to 11 april 1953, where the second parses but not the first
All formats failed to parse. No formats found.
[1] NA
events$document_date_best_date <- events$document_date_clean_2
condition <- is.na(events$document_date_best_date)
events$document_date_best_date[condition] <- events$document_date_clean_1[condition]
(events$document_date_best_year <- year(events$document_date_best_date)) %>% tabyl() %>% round(3)

Only 666 missing from the document date

Type of Event

Heads up, some of these event types in the codebook don’t exist in the data. If a category has zero results, it’s not a bug, just codebook needs to be updated.

cat("\014")

p_load(car, stringi, stringr, xtable, SnowballC)
events$type_clean <- str_trim(stri_trans_totitle(events$type))
(events$type_clean_agglow <- events$type_clean %>%
  str_trim() %>%
  tolower() %>%
  car::recode("
             'desertion'='desertion';
             'escape'='escape';
             c('abduction','kidnapping','kidnap','kitnap','kindnap')='abduction';
             c('assault','attack','assaulted','assaults','assualt','assult')='assault';
             c('murder','elimination','kidnap / murder','')='murder';
             c('arson','burn')='arson';
             c('slashed','stampede')='cattle slashing';
             'vandalism'='vandalism';
             c('theft','thefts','thet','missing','lost','entry')='theft';
             c('confiscate','sentenced')='punishment';
             c('capture','captured')='rebel capture';
             c('oath','oathing','recruitment','recruited')='oathing';
             c('contact','caontact','contacts','drove off','drive off','drove  off',
              'chased off','broke up oathing','ambush')='contact';
             c('patrol','police and kpr patrol','sweep')='patrol';
             c('screening','sreening')='screening';
             c('type')='unclassified'
             ")) %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

NAs introduced by coercion

Collapse Event Types

(events$type_clean_aggmed <- car::recode(events$type_clean_agglow, "
                                 c('abduction','assault','murder')='physical violence';
                                 c('vandalism','arson','cattle slashing')='property destruction';
                                 c('theft')='theft';
                                 c('contact','screening','sreening','patrol','punishment')='security operations';
                                 c('desertion','escape','unclassified')='unclassified';
                            ")) %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)
NAs introduced by coercion
(events$type_clean_agghigh <- recode(events$type_clean_aggmed, "
                                 c('oathing','physical violence','property destruction','theft')='rebel activity';
                                 c('rebel capture','security operations')='government activity';
                            ")) %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)
NAs introduced by coercion

Initiator of Event

Collapsed Initators to just Rebels, Government, and Civilians

cat("\014")

initiator_target_master_clean <- "
c('ammunition')= 'ammunition' ;
c('explosives', 'gelignite')= 'explosives' ;
c('arms', 'firearm', 'gun', 'pistol', 'rifle',
'ammunition', 'rifile', 'shotgun', 'verey pistol')= 'firearms' ;
c('axe','scabbard','weapons')= 'other weapons' ;
c('councillor', 'district commissioner', 'district officer', 'forest ranger', 'game ranger', 
'game warden', 'government',
'government employees', 'port authority', 'public works department', 'screening team' , 'do', 
'govrnment', 'wakamba screening team',
'do munuga','african do','dcmeru', 'colonial authorities' ,'govtemployee'
)= 'colonial authorities' ;
c('chief', 'elders', 'headman' , 'chief chostram','chief eliud', 'chief\\'s sentry'
)= 'tribal authorities' ;
c('buildings', 'cattle dip', 'duka', 'farms',
'garage', 'homes','huts', 'hotel', 'land rover', 'lorry', 'market', 'office', 'oxcart', 'property', 
'pump house', 'sawmill', 'shops', 'stores', 
'tractor', 'vehicle', 'windmill' , 'bullock\\'s farm','cattle boma','coffe trees','coffee trees',
'cuthouse','dairy farm','dip','house','household',
'houses','hut','instrument','labour camp post','labour huts','lorries','lucerne sheds','maize shamba',
'milk factory','pig sty','private property',
'property of civilians','shop','store','thika fishing camp','vehicles')= 'private property';
c('cash', 'funds', 'money' , 'conductor\\'s takings'
)= 'cash';
c('banana', 'barley', 'bran', 'cabbage', 'coffee', 'corn', 'cream', 'crops', 'dairy', 'food', 
'fruit', 'grain', 'honey', 'maize', 
'meat', 'milk', 'oats', 'posho', 'potatoes', 'sugar', 'vegetable', 'wheat',
'food','food etc','food store','food stores','foodstuffs','fruits','grains',
'grains+cloth +money','green maize cobs','potato','potato store',
'potatos','skimmed milk','sugar cane','sugar maize','vegetables','vegitable garden',
'vegitables','wheat bags','wheat store','wheet','whisky'
)= 'food';
c('beast', 'cattle', 'cow', 'herd', 'livestock', 'pig', 'sheep', 'steer', 'stock',
'animal', 'bulls','calf','calves','chicken','cows','donkey','goat','goats',
'head of cattle','head of cow','head of sheep','heifer','heifers',
'lamb','live stock','livestock','livestocks','masai herd','milk cow','ox','ox cart',
'oxen','ram','red poll cattle','shee','sheep or ox','steers','stocks'
)= 'livestock';
c('medical supplies', 'medicine', 'm&b tablets', 'medicines')= 'medicine';
c('bags', 'bedding', 'blankets', 'books', 'charcoal', 'cloth', 'clothing', 
'cooking utensils', 'cutlery', 'equipment', 'farm implements', 
'household items','instruments', 'iron', 'pails','petrol', 'provisions',
'oil', 'sacks', 'supplies', 'tarpaulin', 'thatch', 'timber', 
'tobacco', 'tools', 'uniforms', 'wire', 'wireless set', 'whiskey',
'articles','bag','battery','bucket','ciga','cigarettes','clothes',
'clothing etc','cloths','dairy item','dairy record book','goods',
'material','oil+tins','provisionv','railway uniforms','supplies',
'tarpaulian','typewriter','v- drive belts', 'gunny bags'
)= 'supplies';
c('church')= 'church';
c('airstrip', 'bridges', 'half built village', 'roads', 'trenches', 'water tank',
'bridge', 'bridge broken', 'bridge damaged', 'infrastructure', 'milt property', 
'miltproperty', 'prison camp','stn damaged'
)= 'infrastructure';
c('school', 'school','school building','school house','school property','schools')= 'school';
c('bg','kg','eg', 'guard','embu guard', 'farm guard', 'forest guard', 'home guard',
'ikandine guard', 'kathanjure guard', 'kijabe guard',
'kikuyu guard', 'masai guard', 'meru guard', 'nandi guard', 'nkubu guard',
'stock guard', 'tigoni guard','tp and eg patrol','hg','tp patrol','home guard patrol',
'm', 'm/g','m/g patrol','g',
'kathanjure hg','k g', 'ng',
'eg patrol', 'hg camp','hg leader','hg patrol','hg post','home','home guard','kg post'
)= 'home guard';
c('arab combat' , 'arab combat unit')= 'arab combat units';
c('asian combat', 'asian combat unit', 'asian combat team', 'second asian combat unit' )= 'asian combat units';
c('3 kar', '4 kar', '5 kar', '6 kar', '7 kar', '23 kar', '26 kar','k.a.r','k.p.r','k.a.r.',
'5th k.a.r','5kar','5 k.a.r','4th kar','kar' ) = 'Kings African Rifles';
c('devonshire regiment','devons', 'field intelligence assistant', 'field intelligence officer',
'fio', 'gloucestershire regiment', 'glosters', 'lancashire fusiliers', 'king\\'s shropshire light infantry',
'royal east kent regiment', 'buffs', 'royal fusiliers', 'royal highland regiment','black watch',
'watch', 'royal inniskilling fusiliers', 'royal irish fusiliers', 'royal northumberland fusiliers',
'rnf','police and military', 'army' , 'lancashire fusilliers', 'sp company 1 royal innisks',
'1 rnf', 'rif', 'ksli', 'inniskillings', 'fia','1 glosters', '1 bw', '1 buffs', 
'\"a\" company 1 royal innisks',
'\"a\" company', 'royal fusilers', 'of devons','of 1 glosters', 'lanc fus', 'fusiliers',
'fio kruger','fios','a co devon','4 platoon support company',
'\"c\" company1 royal innisks','6 platoonsp company 1 royal innisks','1 lf',
'\"c\" company',
'\"d\" company','\"a\"','\"a\" company bw','buffs ambush','d company','d\\' force','devens',
'c company','\"d\" force',
'army officer',
'british army officer',
'british military',
'buffs patrol',
'european officer',
'european soldiers',
'gloster patrol'
)= 'british military';
c('kenya regiment','captain folliott’s team' , 'kr', 'kenreg', 'kenregg','kenya regiment sergeant',
'kenya regt','keniya regiment','kenya regiment private')= 'kenya regiment';
c('captain', 'company', 'military', 'army', 'military property', 'platoon', 'security forces',
'security force', 'coy', 'striking force' ,'sentry',
'military (generic)', 'non commissioned officers', 'patrol', 'sentrie', 'sgt white'
)= 'military (generic)';
c('pseudo gang', 'pseudo team', 'trojan', 'psuedo gangs', 'trojan team' , 'tracker group',
'pseudo teams')= 'psuedo gangs';
c('raf', 'bombers', 'air strike', 'harvards', 'raf lincolns','flying squard')='royal air force';
c('general service unit', 'gsu' )= 'paramilitary';
c('cid')='cid';
c('kenya police', 'kp' , 'kp constables\\' quarters', 'kpa'
)= 'kenya police';
c('kenya police reserve', 'kpr', 'kpr officers', 'reserve police officer', 'rpo' , 
'rpos', 'police and k.p.r')= 'kenya police reserve';
c('constable', 'police', 'polce','policy party')= 'police (generic)';
c('railway police' )= 'railway police';
c('special branch', 'blue doctor team', 'special branch team', 'sb officers' )= 'special branch';
c('githumu police', 'masai special constable', 'tribal police', 'tp' , 'tpeg',
'african constable', 'african costable', 'african special constable', 'tribal police'
)= 'tribal police';
c('tribal police reserve', 'tpr') = 'tribal police reserve';
c('manyatta', 'fishing camp', 'sublocation', 'village', 'camp' , 'villages')= 'communities';
c('detainees', 'prisoner', 'prisoners'
)= 'detainees';
c('bandits', 'food foragers', 'gangs', 'gang', 'kiama kia muingi' , 'kkm', 'komerera' , 'mau mau', 'oath administrator', 'passive wing',
'rebels', 'suspects', 'terrorists','terrorosts','terrorist', 'gunman', 'terorist', 'gunmen',
'resistance group','resistance groups', 'oath administrater','oath administrators','passive wing members','resistance','suspect',
'suspected insurgents','terroist','terroists','terrost') = 'suspected insurgents';
c('africans', 'children', 'civilian','civilians', 'driver', 'employees', 'evangelist', 
'family', 'farm boys', 'girls', 'informer',
'kikuyu', 'laborour', 'loyalist', 'masai', 'men', 'mission staff', 'owner', 'passengers',
'people',  'tugen tribesmen' , 'stranger', 'sikh',
'herd boys', 'isiolo game scouts', 'farm labour', 'farmer', 'european', 'employer',
'employee', 'civilan','shopkeeper' , 'students', 'teachers',
'turkana', 'vigilantes', 'women', 'workers','villagers',  'labour', 'local labour',
'kikuyus', 'embu', 'tiriki houseboy', 'samburu', 'manager', 'woman',
'vetofficer', 'mrhiggins', 'masai party','kuria tribesmen','manager of akira estates',
'kuria tribesmen','chstephen','african',
'catholic misson staff', 'african staff', 'asian women', 'bus conductor', 'child',
'civilian(food carriers)', 'civilian(schoolmaster)', 'civilians',
'civilion', 'committee', 'committee member',  'courier','elder','embu tractor driver',
'employees of club','engine boy','girl','golf club staff','his own hut',
'hotel keeper','houseboy','illegal residents','indian','interpreter','kem','kikiyu',
'kikuyu assessor','kikuyu families','kikuyu houseboy','kikuyu labourer','kikyu',
'kirua village','labour line','labour lines','labourer','labourers',
'laboures','labourline','labours','males','man','maragoli','maragoli labourer',
'masai elders','masai tribesman','members of the thika committee',
'mna section leaders','municipal inspectors','non kikuyu employees','person',
'prostitutes','purke masai','pwd employee','railway employees',
'school master','school teacher','sisters committee','somali','staff','strangers',
'taxi drivers','teacher','treasurers',
'headman\\'s son','norton traill\\'s labour','gordon\\'s labour', 'food carriers'
) = 'civilians';
c('')=NA
"
regex <- "\\.|patrol|[1-9]\\s*rd|[1-9]\\s*th" # with regex start trying to get more of these to automatically map instead of generating lots of hand codings
events$initiator_clean <- events$initiator %>% str_trim() %>% gsub(regex, "", .)
events <- events %>%
  dplyr::select(-one_of("initiator_clean_1", "initiator_clean_2", "initiator_clean_3")) %>% # separate will continue to add columns every time its run
  separate(
    col = initiator_clean,
    into = c("initiator_clean_1", "initiator_clean_2", "initiator_clean_3"),
    sep = "and|\\\\|/|\\&|,", remove = F, extra = "drop", fill = "right"
  )
events <- events %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*police.*", "police", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*guard.*", "guard", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*terror.*|.*mau mau.*|.*gang.*", "terrorist", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*kpr.*|.*k p r.*", "kpr", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*kar.*|.*k a r.*", "kar", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*coy.*", "coy", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*gsu.*", "gsu", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(gsub(".*watch.*", "watch", .))) %>%
  mutate_at(vars(starts_with("initiator_clean_")), funs(trimws(.)))
events <- events %>%
  mutate(initiator_clean_1_agglow = recode(initiator_clean_1, initiator_target_master_clean)) %>%
  mutate(initiator_clean_2_agglow = recode(initiator_clean_2, initiator_target_master_clean)) %>%
  mutate(initiator_clean_3_agglow = recode(initiator_clean_3, initiator_target_master_clean))

NAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

# sort(table(events$initiator_clean_1_agglow))
lowlevelagg <- c(
  "arab combat units", "cid", "psuedo gangs", "asian combat units", "special branch",
  "tribal authorities", "tribal police reserve", "royal air force",
  "paramilitary", "kenya regiment", "tribal police", "kenya police reserve", "kenya police",
  "british military", "civilians", "Kings African Rifles", "military (generic)", "police (generic)",
  "railway police", "home guard", "colonial authorities", "suspected insurgents"
)
# events <- events %>%
# mutate(initiator_clean_1_agglow=ifelse(initiator_clean_1_agglow  %in% lowlevelagg & !is.na(initiator_clean_1_agglow),initiator_clean_1_agglow, "uncategorized")) %>% mutate(initiator_clean_2_agglow=ifelse(initiator_clean_2_agglow  %in% lowlevelagg & !is.na(initiator_clean_2_agglow),initiator_clean_2_agglow, "uncategorized")) %>% mutate(initiator_clean_3_agglow=ifelse(initiator_clean_3_agglow  %in% lowlevelagg & !is.na(initiator_clean_3_agglow),initiator_clean_3_agglow, "uncategorized"))
# table(events$initiator_clean_1_agglow, useNA="always")

events[, c("initiator_clean_1_aggmed", "initiator_clean_2_aggmed", "initiator_clean_3_aggmed")] <-
  events[, c("initiator_clean_1_agglow", "initiator_clean_2_agglow", "initiator_clean_3_agglow")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_aggmed|initiator_clean_2_aggmed|initiator_clean_3_aggmed")),
    .funs = funs(car::recode("
     c('cid','kenya police reserve','kenya police','police (generic)','railway police','special branch',
'tribal police','tribal police reserve') = 'police';
     c('arab combat units','asian combat units','british military','Kings African Rifles',
'kenya regiment','military (generic)','psuedo gangs','royal air force') = 'military'; 
     c('colonial authorities', 'tribal authorities')='civil authorities'
          "))
  )

events$initiator_clean_2_aggmed %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

events[, c("initiator_clean_1_agghigh", "initiator_clean_2_agghigh", "initiator_clean_3_agghigh")] <-
  events[, c("initiator_clean_1_aggmed", "initiator_clean_2_aggmed", "initiator_clean_3_aggmed")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_agghigh|initiator_clean_2_agghigh|initiator_clean_3_agghigh")),
    .funs = funs(car::recode("
                  c('civil authorities', 'home guard', 'military', 'police', 'paramilitary') ='government';
                  c('suspected insurgents') ='rebels';
          "))
  )

events$initiator_clean_3_agghigh %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

Target of Event

regex <- "\\.|patrol|[1-9]\\s*rd|[1-9]\\s*th" # with regex start trying to get more of these to automatically map instead of generating lots of hand codings
events$target_clean <- events$initiator %>% str_trim() %>% tolower() %>% gsub(regex, "", .)
events <- events %>%
  dplyr::select(-one_of("target_clean_1", "target_clean_2", "target_clean_3")) %>% # separate will continue to add columns every time its run
  separate(
    col = initiator_clean,
    into = c("target_clean_1", "target_clean_2", "target_clean_3"),
    sep = "and|\\\\|/|\\&|,", remove = F, extra = "drop", fill = "right"
  )
events <- events %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*police.*", "police", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*guard.*", "guard", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*terror.*|.*mau mau.*|.*gang.*", "terrorist", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*kpr.*|.*k p r.*", "kpr", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*kar.*|.*k a r.*", "kar", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*coy.*", "coy", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*gsu.*", "gsu", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(gsub(".*watch.*", "watch", .))) %>%
  mutate_at(vars(starts_with("target_clean_")), funs(trimws(.)))
events <- events %>%
  mutate(target_clean_1_agglow = recode(target_clean_1, initiator_target_master_clean)) %>%
  mutate(target_clean_2_agglow = recode(target_clean_2, initiator_target_master_clean)) %>%
  mutate(target_clean_3_agglow = recode(target_clean_3, initiator_target_master_clean))
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercion
lowlevelagg <- c(
  "church", "kenya police", "medicine", "tribal police reserve", "detainees", "kenya regiment", "other weapons",
  "paramilitary", "ammunition", "communities", "british military", "military (generic)", "tribal authorities", "kenya police reserve", "tribal police",
  "Kings African Rifles", "infrastructure", "school", "cash", "colonial authorities", "police (generic)", "supplies", "firearms", "food", "private property",
  "home guard", "civilians", "livestock", "suspected insurgents"
)
# events <- events %>%
# mutate(target_clean_1_agglow=ifelse(target_clean_1_agglow  %in% lowlevelagg & !is.na(target_clean_1_agglow),target_clean_1_agglow, "uncategorized")) %>% mutate(target_clean_2_agglow=ifelse(target_clean_2_agglow  %in% lowlevelagg & !is.na(target_clean_2_agglow),target_clean_2_agglow, "uncategorized")) %>% mutate(target_clean_3_agglow=ifelse(target_clean_3_agglow  %in% lowlevelagg & !is.na(target_clean_3_agglow),target_clean_3_agglow, "uncategorized"))
events$target_clean_1_agglow %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

events[, c("target_clean_1_aggmed", "target_clean_2_aggmed", "target_clean_3_aggmed")] <-
  events[, c("target_clean_1_agglow", "target_clean_2_agglow", "target_clean_3_agglow")]
events <- events %>%
  mutate_at(
    vars(starts_with("initiator_clean_1_aggmed|initiator_clean_2_aggmed|initiator_clean_3_aggmed")),
    .funs = funs(car::recode(temp, "
     c('cid','kenya police reserve','kenya police','police (generic)','railway police',
'special branch','tribal police','tribal police reserve') = 'police';
     c('arab combat units','asian combat units','british military','Kings African Rifles',
'kenya regiment','military (generic)','psuedo gangs','royal air force') = 'military';
     c('colonial authorities', 'tribal authorities')='civil authorities';
     c('ammunition','firearms','other weapons')='armaments';
     c('cash','food','livestock','medicine','supplies')='provisions';
     c('church','school','infrastructure')='public buildings';
          "))
  )

events$initiator_clean_1_aggmed %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

events[, c("target_clean_1_agghigh", "target_clean_2_agghigh", "target_clean_3_agghigh")] <-
  events[, c("target_clean_1_aggmed", "target_clean_2_aggmed", "target_clean_3_aggmed")]
events <- events %>%
  mutate_at(
    vars(starts_with("target_clean_1_agghigh|target_clean_2_agghigh|target_clean_3_agghigh")),
    .funs = funs(car::recode("
                  c('civil authorities', 'home guard', 'military', 'police', 'paramilitary') ='government';
                  c('suspected insurgents','detainees') ='rebels';
                  c('armaments','private property','provisions','public buildings') ='property';
                  c('communities','communities')='civilians';
          "))
  )

events$target_clean_1_agghigh %>%
  tabyl(sort = TRUE) %>%
  adorn_crosstab(digits = 1)

Count of Initiators

Helper function for recoding

recoderFunc <- function(data, oldvalue, newvalue) {
  # convert any factors to characters
  if (is.factor(data)) data <- as.character(data)
  if (is.factor(oldvalue)) oldvalue <- as.character(oldvalue)
  if (is.factor(newvalue)) newvalue <- as.character(newvalue)
  # create the return vector
  newvec <- data
  # put recoded values into the correct position in the return vector
  for (i in unique(oldvalue)) newvec[data %in% i] <- newvalue[oldvalue %in% i]
  newvec
}
# These numbers are improvised and can be changed
acouple <- 2
afew <- 3
agang <- 6
agang_large <- 12
recodings <- c(
  "100+", "100",
  "??", "",
  "1 bag", "1",
  "1 blanket", "1",
  "1 burnt down", "1",
  "1 civilian", "1",
  "1 cow, 6 sheep", "7",
  "1 cow", "1",
  "1 goat, clothing", "1",
  "1 goat", "1",
  "1 looted", "1",
  "1 looted", "1",
  "1 ox", "1",
  "1 sheep and chickens", "1",
  "1 sheep, some chickens", "1",
  "1 sheep", "1",
  "1 shotgun ,30 rounds", "31",
  "1 shotgun + 10rds", "11",
  "1 steer", "1",
  "1 village, 1 market", "1",
  "1 wounded", "1",
  "1 wrecked", "1",
  "1+", "1",
  "1+3", "4",
  "1+some", "1",
  "10 acres", "10",
  "10 bags", "10",
  "10 cattle", "10",
  "10 sacks", "10",
  "10 to 12", "11",
  "10 to 15", "13",
  "10/14/2013", "",
  "10/15/2013", "",
  "10/20/2013", "",
  "100 lb", "100",
  "100-130", "115",
  "100-150", "125",
  "100+", 100,
  "10000", "",
  "109 cattle", "109",
  "10bags potatoes", "10",
  "11 cattle", "11",
  "11 sheep", "11",
  "112 bore & 20.1.45 &7 rds", "112",
  "12 bags", "12",
  "12 cattle", "12",
  "12 goats", "12",
  "12 to 15", "13",
  "12 to 20", "17",
  "12/14/2013", "",
  "120 cattle", "120",
  "120+1", "121",
  "13 sheep", "13",
  "13-15", "14",
  "1300 worth", "1300",
  "14 cattle", "14",
  "14 goats", "14",
  "14 head", "14",
  "14+", "14",
  "15 - 20", "18",
  "15 cattle", "15",
  "15 to 20", "17",
  "15 to 20", "17",
  "15 to 25", "20",
  "15-20", "17",
  "15+", "15",
  "150-200", "175",
  "150+", "150",
  "151 cattle", "151",
  "17 cattle", "17",
  "172 bags burnt", "172",
  "18 cattle", "18",
  "19 bags", "19",
  "196 rounds", "196",
  "2 bags maize", "2",
  "2 bags", "2",
  "2 bags", "2",
  "2 buckets", "2",
  "2 cattle hamstrung", "2",
  "2 cattle, corn", "3",
  "2 cattle", "2",
  "2 cows", "2",
  "2 debbies", "2",
  "2 goats", "2",
  "2 groups", "2",
  "2 huts burnt", "2",
  "2 sheep", "2",
  "2 watches, cash", "2",
  "2/3/2013", "",
  "2+", "2",
  "20 bags maize, 9 goats, 32 chickens and ducks, cash", "60",
  "20 bags", "20",
  "20 cattle", "20",
  "20 goats", "20",
  "20 sheep", "20",
  "20 to 25", "23",
  "20 to 30", "25",
  "20 to 40", "30",
  "20-25", "23",
  "20-30", "25",
  "20-35", "30",
  "20-50", "35",
  "20/30", "25",
  "20/30", "25",
  "20+", "20",
  "200 yds", "200",
  "200-300", "250",
  "200+", "200",
  "2000 acres", "2000",
  "21 goats", "21",
  "21 head", "21",
  "22 cattle", "22",
  "25 to 30", "28",
  "25-30", "27",
  "25-30", "27",
  "28 killed", "28",
  "28 sheep", "28",
  "3 bags", "3",
  "3 bags", "3",
  "3 bikes", "3",
  "3 cattle", "3",
  "3 cattle", "3",
  "3 goats", "3",
  "3 or 4", "3",
  "3 or 4", "3",
  "3 pangas", "3",
  "3 sheep, 2 calves", "5",
  "3 sheep", "3",
  "3 to 4", "3",
  "3 to 4", "3",
  "3/10/2013", "",
  "3/4/2013", "",
  "3/5/2013", "",
  "3/6/2013", "",
  "3+", "3",
  "3+3+1+2", "9",
  "3+some", "3",
  "30 acres", "30",
  "30 cattle", "30",
  "30 to 40", "35",
  "30-35", "33",
  "30-40", "35",
  "30-50", "40",
  "30+", "30",
  "300-400", "350",
  "300+", "300",
  "35 bags", "35",
  "35 to 40", "37",
  "38 cattle", "38",
  "3or 4", "3",
  "4 bags potatoes", "4",
  "4 bags", "4",
  "4 goats", "4",
  "4 groups", "",
  "4 or 5", "4",
  "4 oxen", "4",
  "4 sheep", "4",
  "4 to 8", "6",
  "4/6/2013", "",
  "40 bag", "40",
  "40 cattle", "40",
  "40 sacks", "40",
  "40 sheep", "40",
  "40 to 50", "45",
  "40/50", "45",
  "400 cattle", "400",
  "4000", "",
  "44 cattle", "44",
  "5 bags", "5",
  "5 calves", "5",
  "5 cattle", "5",
  "5 destroyed", "5",
  "5 goats", "5",
  "5 killed", "5",
  "5 or 6", "5",
  "5 sheep, 1 ox", "6",
  "5 sheep", "5",
  "5 to 6", "5",
  "5/10/2013", "",
  "5/6/2013", "",
  "50 cattle", "50",
  "50 to 60", "55",
  "50-100", "75",
  "50-60", "55",
  "50-75", "62",
  "50+", "50",
  "50+", "50",
  "5000 acres", "5000",
  "519 +", "519",
  "53 detained", "53",
  "54 sheep and goats", "54",
  "56 committee members", "56",
  "6 bag", "6",
  "6 bags", "6",
  "6 cattle", "6",
  "6 cattle", "6",
  "6 goats", "6",
  "6 or 7", "6",
  "6 sheep and goats", "6",
  "6 sheep", "6",
  "6 to 7", "6",
  "6 to 8", "7",
  "6 to 9", "8",
  "6-8 man", "7",
  "6/10/2013", "",
  "6/8/2013", "",
  "60-100", "80",
  "60-70", "65",
  "64 cattle", "64",
  "7 bags", "7",
  "7 cattle", "7",
  "7 sheep", "7",
  "7/10/2013", "",
  "70 bags", "70",
  "70 cattle, sheep", "70",
  "70-100", "85",
  "70000", "",
  "75 rounds", "75",
  "8 bags potatoes", "8",
  "8 cattle", "8",
  "8 cows slashed", "8",
  "8 cows", "8",
  "8 sheep", "8",
  "8 to 10", "9",
  "8/10/2013", "",
  "80 cattle", "80",
  "80-100", "90",
  "84 sheep, 1 cow, 5 chickens", "90",
  "9 cattle", "9",
  "9 sheep", "9",
  "9 to 10", "9",
  "9+9", "18",
  "900(not clear)", "900",
  "all locals", "",
  "all", "",
  "app 5", "5",
  "app. 100", "100",
  "app. 120", "120",
  "armed gang", agang,
  "band", agang,
  "bands", "",
  "cattle slashing", "",
  "clothing", "",
  "considerable quantity", "",
  "fairly large gang", agang_large,
  "few bags", "",
  "few", "",
  "food", "",
  "gang", agang,
  "gangs", agang_large,
  "guards", afew,
  "half village", "",
  "labour", "",
  "large crowd", "",
  "large force", agang_large,
  "large gang", agang_large,
  "large meeting", "",
  "large number", "",
  "large numbers", "",
  "large quantities", "",
  "large quantity", "",
  "large re-oathing ceremony", "",
  "large scale", "",
  "large", agang_large,
  "largish gang", agang_large,
  "local populace", "",
  "many thousand", "2000",
  "mob", "",
  "not given", "",
  "number", "",
  "occupants", "",
  "over 200", "200",
  "party", "",
  "party", agang,
  "patrol", agang,
  "posho", "",
  "potatoes", "",
  "quantity of clothing", "",
  "section", "",
  "several gangs", "agang_large",
  "several", "3",
  "sheep and goats", "",
  "shs 2,300/-", "2300",
  "shs 60/-", "60",
  "shs. 1,000", "1000",
  "shs. 18", "18",
  "shs. 30", "30",
  "small gang", agang,
  "small gangs", "agang",
  "small group", agang,
  "small party", afew,
  "small", agang,
  "some", afew,
  "sufficient food", "",
  "unknown", "",
  "very large gang", "agang_large",
  "villages in ndia, gichugu, embu divisions", "",
  "wives", ""
)
recodings <- matrix(recodings, ncol = 2, byrow = T)
events$initiator_numbers_numeric <- events$initiator_numbers %>% recoderFunc(., recodings[, 1], recodings[, 2]) %>% as.numeric()
number of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthNAs introduced by coercion
events$target_numbers_numeric <- events$target_numbers %>% recoderFunc(., recodings[, 1], recodings[, 2]) %>% as.numeric()
number of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthNAs introduced by coercion
events$affected_count_numeric <- events$affected_count %>% recoderFunc(., recodings[, 1], recodings[, 2]) %>% as.numeric()
number of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthNAs introduced by coercion

Casualties

events[, c(
  "government_killed_clean", "government_wounded_clean", "government_captured_clean",
  "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
  "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
)] <-
  events[, c(
    "government_killed", "government_wounded", "government_captured",
    "rebels_killed", "rebels_wounded", "rebels_captured",
    "civilians_killed", "civilians_wounded", "civilians_captured"
  )]
events <- events %>% mutate_at(
  .vars = c(
    "government_killed_clean", "government_wounded_clean", "government_captured_clean",
    "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
    "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
  ),
  funs(as.numeric(car::recode(., " 'Few'='2';'Many'='3';'others'='2';'Sevaral'='3';
                                  'several'='3'; 'Several More'='3'; 'Several others'='3';
                                   'Some'='3';
                                   '100+'='100'; '23 Families'='23'; '28 families'='28'; '30-40'='35';
                                   '50+'='50'; 'Council of elders'='3';
                                  'Council of war'='3'; 'Few'='2'; 'some'='2'; 
                                   'Several'='3';  '4500'='45'; '800'='80'; 'Gang'='3'; 'Majority'='3'; 
                                 ; 'many'='3'  ; 'Several'='3' ; 'Small gang'='3' ;
                                  '6+'='6' ; '10+'='10' ; '3+'='3';
                                 'unKnown'='1'; 'unknown'='1'; 'UnKnown'='1';  'UNKNOWN'='1'; 'Unkown'='1';
                                 'Unknown'='1' ; 'Number'='1';'More'='1'; '10197'='' ; '101'='1' ;
'48'='7' ; '146'='1' ; '122'='1';  '208'='1'; '94'='1' ;
                                 NA=0")))
)

NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion

events <- events %>% mutate_at(.vars = c(
  "government_killed_clean", "government_wounded_clean", "government_captured_clean",
  "rebels_killed_clean", "rebels_wounded_clean", "rebels_captured_clean",
  "civilians_killed_clean", "civilians_wounded_clean", "civilians_captured_clean"
), funs(as.numeric))
events <- events %>%
  mutate(rebels_killedwounded_clean = rebels_killed_clean + rebels_wounded_clean) %>%
  mutate(government_killed_wounded_clean = government_killed_clean + government_wounded_clean) %>%
  mutate(rebels_government_killedwounded_clean = rebels_killed_clean + rebels_wounded_clean) %>%
  mutate(rebels_government_killed_clean = rebels_killed_clean + government_killed_clean) %>%
  mutate(rebels_government_civilians_killed_clean = rebels_killed_clean + government_killed_clean + civilians_killed_clean)
events %>% crosstab(initiator_clean_1_agghigh, type_clean_agghigh) %>% adorn_crosstab(digits = 1)
events %>% crosstab(target_clean_1_agghigh, type_clean_agghigh) %>% adorn_crosstab(digits = 1)
events %>% crosstab(target_clean_1_agghigh, initiator_clean_1_agghigh) %>% adorn_crosstab(digits = 1)

Output Cleaned File

print(glue(getwd(), "/inst/extdata/MeasuringLandscapeCivilWar_events_cleaned.Rdata"))
C:/Users/skynetmini/Dropbox (rex)/Kenya Article Drafts/MeasuringLandscape/docs/inst/extdata/MeasuringLandscapeCivilWar_events_cleaned.Rdata
saveRDS(events, glue(getwd(), "/../inst/extdata/MeasuringLandscapeCivilWar_events_cleaned.Rdata"))
LS0tDQp0aXRsZTogIjAxIFByZXAgRXZlbnRzIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNClRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgcGFwZXIgIk1lYXN1cmluZyB0aGUgTGFuZHNjYXBlIG9mIENpdmlsIFdhci4iIEluIHRoaXMgZmlsZSwgYSByYXcgY3N2IGZpbGUgb2YgdGhlIGV2ZW50cyBkYXRhc2V0IGNyZWF0ZWQgZm9yIHRoZSBNYXUgTWF1IHJlYmVsbGlvbiBpcyBsb2FkZWQgYW5kIHByb2Nlc3NlZC4NCg0KDQojIExvYWQgTGlicmFyeQ0KDQpgYGB7ciB9DQoNCmxpYnJhcnkoTWVhc3VyaW5nTGFuZHNjYXBlQ2l2aWxXYXIpDQpkZXZ0b29sczo6bG9hZF9hbGwoKQ0KIyBnbG9iYWxfbG9hZHMoKQ0KDQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGNhY2hlID0gVFJVRSkNCm9wdGlvbnMod2lkdGggPSAxNjApDQoNCmV2ZW50cyA8LSBwcmVwX2V2ZW50cyhmcm9tc2NyYXRjaCA9IEYpDQoNCmBgYA0KDQojIERhdGVzDQpCYXNpYyBjbGVhbmluZy4gR2VuZXJhbHkgZm9ybWF0IGlzIERELk1NLllZWVkgU29tZXRpbWVzIG11bHRpcGxlIGRheXMgYXJlIGluY2x1ZGVkIGJ5IEREMS9ERDIvTU0vWVkuIFNvbXRpbWVzIHllYXIgaXMgWVkgb3IgWVlZWS4gDQotWW91ciBwbG90cyBzZWVtIHRvIHN1Z2dlc3QgdGhhdCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgdHlwb3MgaW4gdGhlIGRhdGVzLiBBbGwgZGF0ZXMgc2hvdWxkIHJhbmdlIGJldHdlZW4gMTk1MS0xOTYxLg0KDQpgYGB7ciB9DQoNCiNwX2xvYWQoZGF0ZSkNCg0KZXZlbnRzJGV2ZW50X2RhdGVfY2xlYW4gPC0gZXZlbnRzJGV2ZW50X2RhdGUgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIltbOmRpZ2l0Ol1dKy8iLCAiIikgJT4lICNzdHJpcCBvZmYgZXh0cmEgZGF5IGF0IHRoZSBmcm9udCAwMS8wMi4xMi4xOTUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIlxcLiIsICIvIikgICAgICAgICAgJT4lICNDb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpbXdzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSAjdHJpbSB3aGl0ZXNwYWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIi81MiIsICIvMTk1MiIpICAgICAgJT4lICNjb252ZXJ0IDIgZGlnaXQgeWVhcnMgdG8gNCBkaWdpdCB5ZWFycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2VfYWxsKCIvNTMiLCAiLzE5NTMiKSAgICAgICU+JSAjY29udmVydCAyIGRpZ2l0IHllYXJzIHRvIDQgZGlnaXQgeWVhcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbCgiLzU0IiwgIi8xOTU0IikgICAgICAlPiUgI2NvbnZlcnQgMiBkaWdpdCB5ZWFycyB0byA0IGRpZ2l0IHllYXJzDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIi81NSIsICIvMTk1NSIpICAgICAgJT4lICNjb252ZXJ0IDIgZGlnaXQgeWVhcnMgdG8gNCBkaWdpdCB5ZWFycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2VfYWxsKCIvNTYiLCAiLzE5NTYiKSAgICAgICU+JSAjY29udmVydCAyIGRpZ2l0IHllYXJzIHRvIDQgZGlnaXQgeWVhcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbCgiLzE5NTI0IiwgIi8xOTU0IikgICAlPiUgI2NsZWFuIHR5cG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRteSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0ZlZWQgdG8gbHVicmlkYXRlDQoNCmV2ZW50cyAlPiUgZmlsdGVyKGlzLm5hKGV2ZW50X2RhdGVfY2xlYW4pKSAlPiUgZHBseXI6OnNlbGVjdChzdGFydHNfd2l0aCgiZXZlbnRfZGF0ZSIpKSAlPiUgZGlzdGluY3QoKSAlPiUgcHJpbnQobj00MCkgI3Zpc3VhbGl6ZSBlcnJvcnMNCg0KZXZlbnRzJGV2ZW50X2RhdGVfY2xlYW5feWVhciA8LSB5ZWFyKGV2ZW50cyRldmVudF9kYXRlX2NsZWFuKQ0KZXZlbnRzJGV2ZW50X2RhdGVfY2xlYW5feWVhciAlPiUgdGFieWwoKSAlPiUgcm91bmQoMykNCg0KYGBgDQoNCkhvdyBvZnRlbiBhcmUgZXZlbnQgZGF0ZXMgbWlzc2luZz8NCg0KYGBge3IgfQ0KdGFibGUoZXZlbnRzJGV2ZW50X2RhdGU9PSIiKQ0KYGBgDQoNClRoZSBkb2N1bWVudHMgYWxzbyBoYXZlIGRhdGVzLCBzb21ldGltZXMgc3Bhbm5pbmcgYSBwZXJpb2Qgb2YgdGltZS4gQ2FuIHVzZSB0aGF0IHRvIG5haWwgZG93biBtaXNzaW5nIGRhdGVzLg0KDQpgYGB7ciB9DQoNCihldmVudHMkZG9jdW1lbnRfZGF0ZV90eXBlIDwtIGV2ZW50cyRkb2N1bWVudF9kYXRlICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcigpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zYWljOjpkZXJpdmVkRmFjdG9yKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nIiAgICAgPSBzdHJfZGV0ZWN0KC4sIm9ic2N1cmVkfG1pc3Npbmd8aWxsZWdpYmxlfHh4fERvY3VtZW50IG1pc3NpbmciKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGUiICAgICAgPSBzdHJfZGV0ZWN0KC4sIm9uIHRoZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIiAgICAgICAgICA9IHN0cl9kZXRlY3QoLiwiIHRvIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIiAgICAgICAgID0gc3RyX2RldGVjdCguLCJGb3IgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VlayIgICAgICAgID0gc3RyX2RldGVjdCguLCJ3ZWVrIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VlayBlbmRpbmciID0gc3RyX2RldGVjdCguLCJ3ZWVrIGVuZGluZyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmlvZCIgICAgICA9IHN0cl9kZXRlY3QoLiwicGVyaW9kIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ydG5pZ2h0IiAgID0gc3RyX2RldGVjdCguLCJmb3J0bmlnaHQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRpbmciICAgICAgPSBzdHJfZGV0ZWN0KC4sImVuZGluZyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZCA9ICJsYXN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gInVua25vd24iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSANCiApICU+JSB0YWJ5bCgpIA0KDQoNCmV2ZW50cyRkb2N1bWVudF9kYXRlX2NsZWFuIDwtIGV2ZW50cyRkb2N1bWVudF9kYXRlICU+JSB0b2xvd2VyKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIkZvcnRuaWdodCBFbmRlZCB8cGVyaW9kfHdlZWsgZW5kaW5nfGZvciB8dGhlIHxmb3J0bmlnaHQgfGVuZGluZyB8d2VlayB8RnJvbSB8b24gIiwiIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbCgiW0RpZ2l0c10qdGh8W0RpZ2l0c10qc3R8W0RpZ2l0c10qcmR8W0RpZ2l0c10qbmQiLCIiKQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JSANCiAgICAgICAgIGRwbHlyOjpzZWxlY3QoLW9uZV9vZigiZG9jdW1lbnRfZGF0ZV8xIiwiZG9jdW1lbnRfZGF0ZV8yIikpICU+JSAgI3NlcGFyYXRlIHdpbGwgY29udGludWUgdG8gYWRkIGNvbHVtbnMgZXZlcnkgdGltZSBpdHMgcnVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZShjb2w9ZG9jdW1lbnRfZGF0ZV9jbGVhbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvPWMoImRvY3VtZW50X2RhdGVfMSIsImRvY3VtZW50X2RhdGVfMiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIgdG98dG8gfFRvIHwgLSAiLCByZW1vdmU9RiwgZXh0cmE9ImRyb3AiLCBmaWxsPSJyaWdodCIpDQoNCmV2ZW50cyRkb2N1bWVudF9kYXRlX2NsZWFuXzEgPC0gZXZlbnRzJGRvY3VtZW50X2RhdGVfMSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIltbOmRpZ2l0Ol1dKy8iLCAiIikgICAlPiUgI3N0cmlwIG9mZiBleHRyYSBkYXkgYXQgdGhlIGZyb250IDAxLzAyLjEyLjE5NTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbCgiXFwuIiwgIi8iKSAgICAgICAgICAgICAlPiUgI0NvbnZlcnQgcGVyaW9kcyB0byBzbGFzaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltd3MoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXkoKQ0KDQpldmVudHMkZG9jdW1lbnRfZGF0ZV9jbGVhbl8yIDwtIGV2ZW50cyRkb2N1bWVudF9kYXRlXzIgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2VfYWxsKCJbWzpkaWdpdDpdXSsvIiwgIiIpICAgJT4lICNzdHJpcCBvZmYgZXh0cmEgZGF5IGF0IHRoZSBmcm9udCAwMS8wMi4xMi4xOTUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoIlxcLiIsICIvIikgICAgICAgICAgICAgJT4lICNDb252ZXJ0IHBlcmlvZHMgdG8gc2xhc2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpbXdzKCkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG15KCkgICAgDQoNCmV2ZW50cyAlPiUgZmlsdGVyKGlzLm5hKGRvY3VtZW50X2RhdGVfY2xlYW5fMSkpICU+JSBkcGx5cjo6c2VsZWN0KHN0YXJ0c193aXRoKCJkb2N1bWVudF9kYXRlIikpICU+JSBkaXN0aW5jdCgpICU+JSBwcmludChuPTQwKSAjdmlzdWFsaXplIGVycm9ycw0KDQpwYXJzZV9kYXRlX3RpbWUoYygiMjAxNiIsICIyMDE2LTA0IiksIG9yZGVycyA9IGMoIlkiLCAiWW0iKSkNCnBhcnNlX2RhdGVfdGltZShjKCIyMDE2IiwgImphbi01NSIpLCBvcmRlcnMgPSBjKCJZIiwgIlltIiwiYlkiKSkNCg0KcGFyc2VfZGF0ZV90aW1lKCIxOTA0LWphbiIsICJ5YiIpICNvayBzbyB0aGVyZSBhcmUgamFuLTU0IHRoYXQgZG9uJ3QgcGFyc2UsIHRoZXJlIGFyZSAyNSBtYXJjaCB0byAxMSBhcHJpbCAxOTUzLCB3aGVyZSB0aGUgc2Vjb25kIHBhcnNlcyBidXQgbm90IHRoZSBmaXJzdA0KDQpldmVudHMkZG9jdW1lbnRfZGF0ZV9iZXN0X2RhdGUgPC0gZXZlbnRzJGRvY3VtZW50X2RhdGVfY2xlYW5fMg0KY29uZGl0aW9uIDwtIGlzLm5hKGV2ZW50cyRkb2N1bWVudF9kYXRlX2Jlc3RfZGF0ZSkNCmV2ZW50cyRkb2N1bWVudF9kYXRlX2Jlc3RfZGF0ZVtjb25kaXRpb25dIDwtIGV2ZW50cyRkb2N1bWVudF9kYXRlX2NsZWFuXzFbY29uZGl0aW9uXQ0KKGV2ZW50cyRkb2N1bWVudF9kYXRlX2Jlc3RfeWVhciA8LSB5ZWFyKGV2ZW50cyRkb2N1bWVudF9kYXRlX2Jlc3RfZGF0ZSkpICU+JSB0YWJ5bCgpICU+JSByb3VuZCgzKQ0KDQpgYGANCg0KT25seSA2NjYgbWlzc2luZyBmcm9tIHRoZSBkb2N1bWVudCBkYXRlDQoNCiMgVHlwZSBvZiBFdmVudA0KDQpIZWFkcyB1cCwgc29tZSBvZiB0aGVzZSBldmVudCB0eXBlcyBpbiB0aGUgY29kZWJvb2sgZG9uJ3QgZXhpc3QgaW4gdGhlIGRhdGEuIElmIGEgY2F0ZWdvcnkgaGFzIHplcm8gcmVzdWx0cywgaXQncyBub3QgYSBidWcsIGp1c3QgY29kZWJvb2sgbmVlZHMgdG8gYmUgdXBkYXRlZC4NCg0KYGBge3IgVHlwZSBvZiBFdmVudCwgcmVzdWx0cz0iYXNpcyJ9DQoNCmNhdCgiXDAxNCIpDQpwX2xvYWQoY2FyLCBzdHJpbmdpLCBzdHJpbmdyLCB4dGFibGUsIFNub3diYWxsQykNCmV2ZW50cyR0eXBlX2NsZWFuIDwtIHN0cl90cmltKHN0cmlfdHJhbnNfdG90aXRsZShldmVudHMkdHlwZSkpDQoNCihldmVudHMkdHlwZV9jbGVhbl9hZ2dsb3cgPC0gZXZlbnRzJHR5cGVfY2xlYW4gJT4lDQogIHN0cl90cmltKCkgJT4lDQogIHRvbG93ZXIoKSAlPiUNCiAgY2FyOjpyZWNvZGUoIg0KICAgICAgICAgICAgICdkZXNlcnRpb24nPSdkZXNlcnRpb24nOw0KICAgICAgICAgICAgICdlc2NhcGUnPSdlc2NhcGUnOw0KICAgICAgICAgICAgIGMoJ2FiZHVjdGlvbicsJ2tpZG5hcHBpbmcnLCdraWRuYXAnLCdraXRuYXAnLCdraW5kbmFwJyk9J2FiZHVjdGlvbic7DQogICAgICAgICAgICAgYygnYXNzYXVsdCcsJ2F0dGFjaycsJ2Fzc2F1bHRlZCcsJ2Fzc2F1bHRzJywnYXNzdWFsdCcsJ2Fzc3VsdCcpPSdhc3NhdWx0JzsNCiAgICAgICAgICAgICBjKCdtdXJkZXInLCdlbGltaW5hdGlvbicsJ2tpZG5hcCAvIG11cmRlcicsJycpPSdtdXJkZXInOw0KICAgICAgICAgICAgIGMoJ2Fyc29uJywnYnVybicpPSdhcnNvbic7DQogICAgICAgICAgICAgYygnc2xhc2hlZCcsJ3N0YW1wZWRlJyk9J2NhdHRsZSBzbGFzaGluZyc7DQogICAgICAgICAgICAgJ3ZhbmRhbGlzbSc9J3ZhbmRhbGlzbSc7DQogICAgICAgICAgICAgYygndGhlZnQnLCd0aGVmdHMnLCd0aGV0JywnbWlzc2luZycsJ2xvc3QnLCdlbnRyeScpPSd0aGVmdCc7DQogICAgICAgICAgICAgYygnY29uZmlzY2F0ZScsJ3NlbnRlbmNlZCcpPSdwdW5pc2htZW50JzsNCiAgICAgICAgICAgICBjKCdjYXB0dXJlJywnY2FwdHVyZWQnKT0ncmViZWwgY2FwdHVyZSc7DQogICAgICAgICAgICAgYygnb2F0aCcsJ29hdGhpbmcnLCdyZWNydWl0bWVudCcsJ3JlY3J1aXRlZCcpPSdvYXRoaW5nJzsNCiAgICAgICAgICAgICBjKCdjb250YWN0JywnY2FvbnRhY3QnLCdjb250YWN0cycsJ2Ryb3ZlIG9mZicsJ2RyaXZlIG9mZicsJ2Ryb3ZlICBvZmYnLA0KICAgICAgICAgICAgICAnY2hhc2VkIG9mZicsJ2Jyb2tlIHVwIG9hdGhpbmcnLCdhbWJ1c2gnKT0nY29udGFjdCc7DQogICAgICAgICAgICAgYygncGF0cm9sJywncG9saWNlIGFuZCBrcHIgcGF0cm9sJywnc3dlZXAnKT0ncGF0cm9sJzsNCiAgICAgICAgICAgICBjKCdzY3JlZW5pbmcnLCdzcmVlbmluZycpPSdzY3JlZW5pbmcnOw0KICAgICAgICAgICAgIGMoJ3R5cGUnKT0ndW5jbGFzc2lmaWVkJw0KICAgICAgICAgICAgICIpKSAlPiUNCiAgdGFieWwoc29ydCA9IFRSVUUpICU+JQ0KICBhZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQ0KYGBgDQoNCiMjIENvbGxhcHNlIEV2ZW50IFR5cGVzDQoNCmBgYHtyIENvbGxhcHNlIEV2ZW50IFR5cGVzIE1lZGl1bSxjYWNoZT1UfQ0KDQooZXZlbnRzJHR5cGVfY2xlYW5fYWdnbWVkIDwtIGNhcjo6cmVjb2RlKGV2ZW50cyR0eXBlX2NsZWFuX2FnZ2xvdywgIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygnYWJkdWN0aW9uJywnYXNzYXVsdCcsJ211cmRlcicpPSdwaHlzaWNhbCB2aW9sZW5jZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCd2YW5kYWxpc20nLCdhcnNvbicsJ2NhdHRsZSBzbGFzaGluZycpPSdwcm9wZXJ0eSBkZXN0cnVjdGlvbic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCd0aGVmdCcpPSd0aGVmdCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCdjb250YWN0Jywnc2NyZWVuaW5nJywnc3JlZW5pbmcnLCdwYXRyb2wnLCdwdW5pc2htZW50Jyk9J3NlY3VyaXR5IG9wZXJhdGlvbnMnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygnZGVzZXJ0aW9uJywnZXNjYXBlJywndW5jbGFzc2lmaWVkJyk9J3VuY2xhc3NpZmllZCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIikpICU+JQ0KICB0YWJ5bChzb3J0ID0gVFJVRSkgJT4lDQogIGFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpDQpgYGANCg0KYGBge3IgQ29sbGFwc2UgRXZlbnQgVHlwZXMgSGlnaCxjYWNoZT1UfQ0KDQooZXZlbnRzJHR5cGVfY2xlYW5fYWdnaGlnaCA8LSByZWNvZGUoZXZlbnRzJHR5cGVfY2xlYW5fYWdnbWVkLCAiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCdvYXRoaW5nJywncGh5c2ljYWwgdmlvbGVuY2UnLCdwcm9wZXJ0eSBkZXN0cnVjdGlvbicsJ3RoZWZ0Jyk9J3JlYmVsIGFjdGl2aXR5JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoJ3JlYmVsIGNhcHR1cmUnLCdzZWN1cml0eSBvcGVyYXRpb25zJyk9J2dvdmVybm1lbnQgYWN0aXZpdHknOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpKSAlPiUNCiAgdGFieWwoc29ydCA9IFRSVUUpICU+JQ0KICBhZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQ0KYGBgDQoNCg0KDQoNCiMgSW5pdGlhdG9yIG9mIEV2ZW50DQoNCkNvbGxhcHNlZCBJbml0YXRvcnMgdG8ganVzdCBSZWJlbHMsIEdvdmVybm1lbnQsIGFuZCBDaXZpbGlhbnMNCg0KYGBge3IgSW5pdGlhdG9yIG9mIEV2ZW50LCByZXN1bHRzPSJhc2lzIn0NCg0KY2F0KCJcMDE0IikNCg0KaW5pdGlhdG9yX3RhcmdldF9tYXN0ZXJfY2xlYW4gPC0gIg0KYygnYW1tdW5pdGlvbicpPSAnYW1tdW5pdGlvbicgOw0KDQpjKCdleHBsb3NpdmVzJywgJ2dlbGlnbml0ZScpPSAnZXhwbG9zaXZlcycgOw0KDQpjKCdhcm1zJywgJ2ZpcmVhcm0nLCAnZ3VuJywgJ3Bpc3RvbCcsICdyaWZsZScsDQonYW1tdW5pdGlvbicsICdyaWZpbGUnLCAnc2hvdGd1bicsICd2ZXJleSBwaXN0b2wnKT0gJ2ZpcmVhcm1zJyA7DQoNCmMoJ2F4ZScsJ3NjYWJiYXJkJywnd2VhcG9ucycpPSAnb3RoZXIgd2VhcG9ucycgOw0KDQpjKCdjb3VuY2lsbG9yJywgJ2Rpc3RyaWN0IGNvbW1pc3Npb25lcicsICdkaXN0cmljdCBvZmZpY2VyJywgJ2ZvcmVzdCByYW5nZXInLCAnZ2FtZSByYW5nZXInLCANCidnYW1lIHdhcmRlbicsICdnb3Zlcm5tZW50JywNCidnb3Zlcm5tZW50IGVtcGxveWVlcycsICdwb3J0IGF1dGhvcml0eScsICdwdWJsaWMgd29ya3MgZGVwYXJ0bWVudCcsICdzY3JlZW5pbmcgdGVhbScgLCAnZG8nLCANCidnb3Zybm1lbnQnLCAnd2FrYW1iYSBzY3JlZW5pbmcgdGVhbScsDQonZG8gbXVudWdhJywnYWZyaWNhbiBkbycsJ2RjbWVydScsICdjb2xvbmlhbCBhdXRob3JpdGllcycgLCdnb3Z0ZW1wbG95ZWUnDQopPSAnY29sb25pYWwgYXV0aG9yaXRpZXMnIDsNCg0KYygnY2hpZWYnLCAnZWxkZXJzJywgJ2hlYWRtYW4nICwgJ2NoaWVmIGNob3N0cmFtJywnY2hpZWYgZWxpdWQnLCAnY2hpZWZcXCdzIHNlbnRyeScNCik9ICd0cmliYWwgYXV0aG9yaXRpZXMnIDsNCg0KYygnYnVpbGRpbmdzJywgJ2NhdHRsZSBkaXAnLCAnZHVrYScsICdmYXJtcycsDQonZ2FyYWdlJywgJ2hvbWVzJywnaHV0cycsICdob3RlbCcsICdsYW5kIHJvdmVyJywgJ2xvcnJ5JywgJ21hcmtldCcsICdvZmZpY2UnLCAnb3hjYXJ0JywgJ3Byb3BlcnR5JywgDQoncHVtcCBob3VzZScsICdzYXdtaWxsJywgJ3Nob3BzJywgJ3N0b3JlcycsIA0KJ3RyYWN0b3InLCAndmVoaWNsZScsICd3aW5kbWlsbCcgLCAnYnVsbG9ja1xcJ3MgZmFybScsJ2NhdHRsZSBib21hJywnY29mZmUgdHJlZXMnLCdjb2ZmZWUgdHJlZXMnLA0KJ2N1dGhvdXNlJywnZGFpcnkgZmFybScsJ2RpcCcsJ2hvdXNlJywnaG91c2Vob2xkJywNCidob3VzZXMnLCdodXQnLCdpbnN0cnVtZW50JywnbGFib3VyIGNhbXAgcG9zdCcsJ2xhYm91ciBodXRzJywnbG9ycmllcycsJ2x1Y2VybmUgc2hlZHMnLCdtYWl6ZSBzaGFtYmEnLA0KJ21pbGsgZmFjdG9yeScsJ3BpZyBzdHknLCdwcml2YXRlIHByb3BlcnR5JywNCidwcm9wZXJ0eSBvZiBjaXZpbGlhbnMnLCdzaG9wJywnc3RvcmUnLCd0aGlrYSBmaXNoaW5nIGNhbXAnLCd2ZWhpY2xlcycpPSAncHJpdmF0ZSBwcm9wZXJ0eSc7DQoNCmMoJ2Nhc2gnLCAnZnVuZHMnLCAnbW9uZXknICwgJ2NvbmR1Y3RvclxcJ3MgdGFraW5ncycNCik9ICdjYXNoJzsNCg0KYygnYmFuYW5hJywgJ2JhcmxleScsICdicmFuJywgJ2NhYmJhZ2UnLCAnY29mZmVlJywgJ2Nvcm4nLCAnY3JlYW0nLCAnY3JvcHMnLCAnZGFpcnknLCAnZm9vZCcsIA0KJ2ZydWl0JywgJ2dyYWluJywgJ2hvbmV5JywgJ21haXplJywgDQonbWVhdCcsICdtaWxrJywgJ29hdHMnLCAncG9zaG8nLCAncG90YXRvZXMnLCAnc3VnYXInLCAndmVnZXRhYmxlJywgJ3doZWF0JywNCidmb29kJywnZm9vZCBldGMnLCdmb29kIHN0b3JlJywnZm9vZCBzdG9yZXMnLCdmb29kc3R1ZmZzJywnZnJ1aXRzJywnZ3JhaW5zJywNCidncmFpbnMrY2xvdGggK21vbmV5JywnZ3JlZW4gbWFpemUgY29icycsJ3BvdGF0bycsJ3BvdGF0byBzdG9yZScsDQoncG90YXRvcycsJ3NraW1tZWQgbWlsaycsJ3N1Z2FyIGNhbmUnLCdzdWdhciBtYWl6ZScsJ3ZlZ2V0YWJsZXMnLCd2ZWdpdGFibGUgZ2FyZGVuJywNCid2ZWdpdGFibGVzJywnd2hlYXQgYmFncycsJ3doZWF0IHN0b3JlJywnd2hlZXQnLCd3aGlza3knDQopPSAnZm9vZCc7DQoNCmMoJ2JlYXN0JywgJ2NhdHRsZScsICdjb3cnLCAnaGVyZCcsICdsaXZlc3RvY2snLCAncGlnJywgJ3NoZWVwJywgJ3N0ZWVyJywgJ3N0b2NrJywNCidhbmltYWwnLCAnYnVsbHMnLCdjYWxmJywnY2FsdmVzJywnY2hpY2tlbicsJ2Nvd3MnLCdkb25rZXknLCdnb2F0JywnZ29hdHMnLA0KJ2hlYWQgb2YgY2F0dGxlJywnaGVhZCBvZiBjb3cnLCdoZWFkIG9mIHNoZWVwJywnaGVpZmVyJywnaGVpZmVycycsDQonbGFtYicsJ2xpdmUgc3RvY2snLCdsaXZlc3RvY2snLCdsaXZlc3RvY2tzJywnbWFzYWkgaGVyZCcsJ21pbGsgY293Jywnb3gnLCdveCBjYXJ0JywNCidveGVuJywncmFtJywncmVkIHBvbGwgY2F0dGxlJywnc2hlZScsJ3NoZWVwIG9yIG94Jywnc3RlZXJzJywnc3RvY2tzJw0KKT0gJ2xpdmVzdG9jayc7DQoNCmMoJ21lZGljYWwgc3VwcGxpZXMnLCAnbWVkaWNpbmUnLCAnbSZiIHRhYmxldHMnLCAnbWVkaWNpbmVzJyk9ICdtZWRpY2luZSc7DQoNCmMoJ2JhZ3MnLCAnYmVkZGluZycsICdibGFua2V0cycsICdib29rcycsICdjaGFyY29hbCcsICdjbG90aCcsICdjbG90aGluZycsIA0KJ2Nvb2tpbmcgdXRlbnNpbHMnLCAnY3V0bGVyeScsICdlcXVpcG1lbnQnLCAnZmFybSBpbXBsZW1lbnRzJywgDQonaG91c2Vob2xkIGl0ZW1zJywnaW5zdHJ1bWVudHMnLCAnaXJvbicsICdwYWlscycsJ3BldHJvbCcsICdwcm92aXNpb25zJywNCidvaWwnLCAnc2Fja3MnLCAnc3VwcGxpZXMnLCAndGFycGF1bGluJywgJ3RoYXRjaCcsICd0aW1iZXInLCANCid0b2JhY2NvJywgJ3Rvb2xzJywgJ3VuaWZvcm1zJywgJ3dpcmUnLCAnd2lyZWxlc3Mgc2V0JywgJ3doaXNrZXknLA0KJ2FydGljbGVzJywnYmFnJywnYmF0dGVyeScsJ2J1Y2tldCcsJ2NpZ2EnLCdjaWdhcmV0dGVzJywnY2xvdGhlcycsDQonY2xvdGhpbmcgZXRjJywnY2xvdGhzJywnZGFpcnkgaXRlbScsJ2RhaXJ5IHJlY29yZCBib29rJywnZ29vZHMnLA0KJ21hdGVyaWFsJywnb2lsK3RpbnMnLCdwcm92aXNpb252JywncmFpbHdheSB1bmlmb3JtcycsJ3N1cHBsaWVzJywNCid0YXJwYXVsaWFuJywndHlwZXdyaXRlcicsJ3YtIGRyaXZlIGJlbHRzJywgJ2d1bm55IGJhZ3MnDQopPSAnc3VwcGxpZXMnOw0KDQpjKCdjaHVyY2gnKT0gJ2NodXJjaCc7DQoNCmMoJ2FpcnN0cmlwJywgJ2JyaWRnZXMnLCAnaGFsZiBidWlsdCB2aWxsYWdlJywgJ3JvYWRzJywgJ3RyZW5jaGVzJywgJ3dhdGVyIHRhbmsnLA0KJ2JyaWRnZScsICdicmlkZ2UgYnJva2VuJywgJ2JyaWRnZSBkYW1hZ2VkJywgJ2luZnJhc3RydWN0dXJlJywgJ21pbHQgcHJvcGVydHknLCANCidtaWx0cHJvcGVydHknLCAncHJpc29uIGNhbXAnLCdzdG4gZGFtYWdlZCcNCik9ICdpbmZyYXN0cnVjdHVyZSc7DQoNCmMoJ3NjaG9vbCcsICdzY2hvb2wnLCdzY2hvb2wgYnVpbGRpbmcnLCdzY2hvb2wgaG91c2UnLCdzY2hvb2wgcHJvcGVydHknLCdzY2hvb2xzJyk9ICdzY2hvb2wnOw0KDQpjKCdiZycsJ2tnJywnZWcnLCAnZ3VhcmQnLCdlbWJ1IGd1YXJkJywgJ2Zhcm0gZ3VhcmQnLCAnZm9yZXN0IGd1YXJkJywgJ2hvbWUgZ3VhcmQnLA0KJ2lrYW5kaW5lIGd1YXJkJywgJ2thdGhhbmp1cmUgZ3VhcmQnLCAna2lqYWJlIGd1YXJkJywNCidraWt1eXUgZ3VhcmQnLCAnbWFzYWkgZ3VhcmQnLCAnbWVydSBndWFyZCcsICduYW5kaSBndWFyZCcsICdua3VidSBndWFyZCcsDQonc3RvY2sgZ3VhcmQnLCAndGlnb25pIGd1YXJkJywndHAgYW5kIGVnIHBhdHJvbCcsJ2hnJywndHAgcGF0cm9sJywnaG9tZSBndWFyZCBwYXRyb2wnLA0KJ20nLCAnbS9nJywnbS9nIHBhdHJvbCcsJ2cnLA0KJ2thdGhhbmp1cmUgaGcnLCdrIGcnLCAnbmcnLA0KJ2VnIHBhdHJvbCcsICdoZyBjYW1wJywnaGcgbGVhZGVyJywnaGcgcGF0cm9sJywnaGcgcG9zdCcsJ2hvbWUnLCdob21lIGd1YXJkJywna2cgcG9zdCcNCik9ICdob21lIGd1YXJkJzsNCg0KYygnYXJhYiBjb21iYXQnICwgJ2FyYWIgY29tYmF0IHVuaXQnKT0gJ2FyYWIgY29tYmF0IHVuaXRzJzsNCg0KYygnYXNpYW4gY29tYmF0JywgJ2FzaWFuIGNvbWJhdCB1bml0JywgJ2FzaWFuIGNvbWJhdCB0ZWFtJywgJ3NlY29uZCBhc2lhbiBjb21iYXQgdW5pdCcgKT0gJ2FzaWFuIGNvbWJhdCB1bml0cyc7DQoNCmMoJzMga2FyJywgJzQga2FyJywgJzUga2FyJywgJzYga2FyJywgJzcga2FyJywgJzIzIGthcicsICcyNiBrYXInLCdrLmEucicsJ2sucC5yJywnay5hLnIuJywNCic1dGggay5hLnInLCc1a2FyJywnNSBrLmEucicsJzR0aCBrYXInLCdrYXInICkgPSAnS2luZ3MgQWZyaWNhbiBSaWZsZXMnOw0KDQpjKCdkZXZvbnNoaXJlIHJlZ2ltZW50JywnZGV2b25zJywgJ2ZpZWxkIGludGVsbGlnZW5jZSBhc3Npc3RhbnQnLCAnZmllbGQgaW50ZWxsaWdlbmNlIG9mZmljZXInLA0KJ2ZpbycsICdnbG91Y2VzdGVyc2hpcmUgcmVnaW1lbnQnLCAnZ2xvc3RlcnMnLCAnbGFuY2FzaGlyZSBmdXNpbGllcnMnLCAna2luZ1xcJ3Mgc2hyb3BzaGlyZSBsaWdodCBpbmZhbnRyeScsDQoncm95YWwgZWFzdCBrZW50IHJlZ2ltZW50JywgJ2J1ZmZzJywgJ3JveWFsIGZ1c2lsaWVycycsICdyb3lhbCBoaWdobGFuZCByZWdpbWVudCcsJ2JsYWNrIHdhdGNoJywNCid3YXRjaCcsICdyb3lhbCBpbm5pc2tpbGxpbmcgZnVzaWxpZXJzJywgJ3JveWFsIGlyaXNoIGZ1c2lsaWVycycsICdyb3lhbCBub3J0aHVtYmVybGFuZCBmdXNpbGllcnMnLA0KJ3JuZicsJ3BvbGljZSBhbmQgbWlsaXRhcnknLCAnYXJteScgLCAnbGFuY2FzaGlyZSBmdXNpbGxpZXJzJywgJ3NwIGNvbXBhbnkgMSByb3lhbCBpbm5pc2tzJywNCicxIHJuZicsICdyaWYnLCAna3NsaScsICdpbm5pc2tpbGxpbmdzJywgJ2ZpYScsJzEgZ2xvc3RlcnMnLCAnMSBidycsICcxIGJ1ZmZzJywgDQonXCJhXCIgY29tcGFueSAxIHJveWFsIGlubmlza3MnLA0KJ1wiYVwiIGNvbXBhbnknLCAncm95YWwgZnVzaWxlcnMnLCAnb2YgZGV2b25zJywnb2YgMSBnbG9zdGVycycsICdsYW5jIGZ1cycsICdmdXNpbGllcnMnLA0KJ2ZpbyBrcnVnZXInLCdmaW9zJywnYSBjbyBkZXZvbicsJzQgcGxhdG9vbiBzdXBwb3J0IGNvbXBhbnknLA0KJ1wiY1wiIGNvbXBhbnkxIHJveWFsIGlubmlza3MnLCc2IHBsYXRvb25zcCBjb21wYW55IDEgcm95YWwgaW5uaXNrcycsJzEgbGYnLA0KJ1wiY1wiIGNvbXBhbnknLA0KJ1wiZFwiIGNvbXBhbnknLCdcImFcIicsJ1wiYVwiIGNvbXBhbnkgYncnLCdidWZmcyBhbWJ1c2gnLCdkIGNvbXBhbnknLCdkXFwnIGZvcmNlJywnZGV2ZW5zJywNCidjIGNvbXBhbnknLCdcImRcIiBmb3JjZScsDQonYXJteSBvZmZpY2VyJywNCidicml0aXNoIGFybXkgb2ZmaWNlcicsDQonYnJpdGlzaCBtaWxpdGFyeScsDQonYnVmZnMgcGF0cm9sJywNCidldXJvcGVhbiBvZmZpY2VyJywNCidldXJvcGVhbiBzb2xkaWVycycsDQonZ2xvc3RlciBwYXRyb2wnDQopPSAnYnJpdGlzaCBtaWxpdGFyeSc7DQoNCg0KYygna2VueWEgcmVnaW1lbnQnLCdjYXB0YWluIGZvbGxpb3R04oCZcyB0ZWFtJyAsICdrcicsICdrZW5yZWcnLCAna2VucmVnZycsJ2tlbnlhIHJlZ2ltZW50IHNlcmdlYW50JywNCidrZW55YSByZWd0Jywna2VuaXlhIHJlZ2ltZW50Jywna2VueWEgcmVnaW1lbnQgcHJpdmF0ZScpPSAna2VueWEgcmVnaW1lbnQnOw0KDQpjKCdjYXB0YWluJywgJ2NvbXBhbnknLCAnbWlsaXRhcnknLCAnYXJteScsICdtaWxpdGFyeSBwcm9wZXJ0eScsICdwbGF0b29uJywgJ3NlY3VyaXR5IGZvcmNlcycsDQonc2VjdXJpdHkgZm9yY2UnLCAnY295JywgJ3N0cmlraW5nIGZvcmNlJyAsJ3NlbnRyeScsDQonbWlsaXRhcnkgKGdlbmVyaWMpJywgJ25vbiBjb21taXNzaW9uZWQgb2ZmaWNlcnMnLCAncGF0cm9sJywgJ3NlbnRyaWUnLCAnc2d0IHdoaXRlJw0KKT0gJ21pbGl0YXJ5IChnZW5lcmljKSc7DQoNCmMoJ3BzZXVkbyBnYW5nJywgJ3BzZXVkbyB0ZWFtJywgJ3Ryb2phbicsICdwc3VlZG8gZ2FuZ3MnLCAndHJvamFuIHRlYW0nICwgJ3RyYWNrZXIgZ3JvdXAnLA0KJ3BzZXVkbyB0ZWFtcycpPSAncHN1ZWRvIGdhbmdzJzsNCg0KYygncmFmJywgJ2JvbWJlcnMnLCAnYWlyIHN0cmlrZScsICdoYXJ2YXJkcycsICdyYWYgbGluY29sbnMnLCdmbHlpbmcgc3F1YXJkJyk9J3JveWFsIGFpciBmb3JjZSc7DQoNCmMoJ2dlbmVyYWwgc2VydmljZSB1bml0JywgJ2dzdScgKT0gJ3BhcmFtaWxpdGFyeSc7DQoNCmMoJ2NpZCcpPSdjaWQnOw0KDQpjKCdrZW55YSBwb2xpY2UnLCAna3AnICwgJ2twIGNvbnN0YWJsZXNcXCcgcXVhcnRlcnMnLCAna3BhJw0KKT0gJ2tlbnlhIHBvbGljZSc7DQoNCmMoJ2tlbnlhIHBvbGljZSByZXNlcnZlJywgJ2twcicsICdrcHIgb2ZmaWNlcnMnLCAncmVzZXJ2ZSBwb2xpY2Ugb2ZmaWNlcicsICdycG8nICwgDQoncnBvcycsICdwb2xpY2UgYW5kIGsucC5yJyk9ICdrZW55YSBwb2xpY2UgcmVzZXJ2ZSc7DQoNCmMoJ2NvbnN0YWJsZScsICdwb2xpY2UnLCAncG9sY2UnLCdwb2xpY3kgcGFydHknKT0gJ3BvbGljZSAoZ2VuZXJpYyknOw0KDQpjKCdyYWlsd2F5IHBvbGljZScgKT0gJ3JhaWx3YXkgcG9saWNlJzsNCg0KYygnc3BlY2lhbCBicmFuY2gnLCAnYmx1ZSBkb2N0b3IgdGVhbScsICdzcGVjaWFsIGJyYW5jaCB0ZWFtJywgJ3NiIG9mZmljZXJzJyApPSAnc3BlY2lhbCBicmFuY2gnOw0KDQpjKCdnaXRodW11IHBvbGljZScsICdtYXNhaSBzcGVjaWFsIGNvbnN0YWJsZScsICd0cmliYWwgcG9saWNlJywgJ3RwJyAsICd0cGVnJywNCidhZnJpY2FuIGNvbnN0YWJsZScsICdhZnJpY2FuIGNvc3RhYmxlJywgJ2FmcmljYW4gc3BlY2lhbCBjb25zdGFibGUnLCAndHJpYmFsIHBvbGljZScNCik9ICd0cmliYWwgcG9saWNlJzsNCg0KYygndHJpYmFsIHBvbGljZSByZXNlcnZlJywgJ3RwcicpID0gJ3RyaWJhbCBwb2xpY2UgcmVzZXJ2ZSc7DQoNCmMoJ21hbnlhdHRhJywgJ2Zpc2hpbmcgY2FtcCcsICdzdWJsb2NhdGlvbicsICd2aWxsYWdlJywgJ2NhbXAnICwgJ3ZpbGxhZ2VzJyk9ICdjb21tdW5pdGllcyc7DQoNCmMoJ2RldGFpbmVlcycsICdwcmlzb25lcicsICdwcmlzb25lcnMnDQopPSAnZGV0YWluZWVzJzsNCg0KYygnYmFuZGl0cycsICdmb29kIGZvcmFnZXJzJywgJ2dhbmdzJywgJ2dhbmcnLCAna2lhbWEga2lhIG11aW5naScgLCAna2ttJywgJ2tvbWVyZXJhJyAsICdtYXUgbWF1JywgJ29hdGggYWRtaW5pc3RyYXRvcicsICdwYXNzaXZlIHdpbmcnLA0KJ3JlYmVscycsICdzdXNwZWN0cycsICd0ZXJyb3Jpc3RzJywndGVycm9yb3N0cycsJ3RlcnJvcmlzdCcsICdndW5tYW4nLCAndGVyb3Jpc3QnLCAnZ3VubWVuJywNCidyZXNpc3RhbmNlIGdyb3VwJywncmVzaXN0YW5jZSBncm91cHMnLCAnb2F0aCBhZG1pbmlzdHJhdGVyJywnb2F0aCBhZG1pbmlzdHJhdG9ycycsJ3Bhc3NpdmUgd2luZyBtZW1iZXJzJywncmVzaXN0YW5jZScsJ3N1c3BlY3QnLA0KJ3N1c3BlY3RlZCBpbnN1cmdlbnRzJywndGVycm9pc3QnLCd0ZXJyb2lzdHMnLCd0ZXJyb3N0JykgPSAnc3VzcGVjdGVkIGluc3VyZ2VudHMnOw0KDQpjKCdhZnJpY2FucycsICdjaGlsZHJlbicsICdjaXZpbGlhbicsJ2NpdmlsaWFucycsICdkcml2ZXInLCAnZW1wbG95ZWVzJywgJ2V2YW5nZWxpc3QnLCANCidmYW1pbHknLCAnZmFybSBib3lzJywgJ2dpcmxzJywgJ2luZm9ybWVyJywNCidraWt1eXUnLCAnbGFib3JvdXInLCAnbG95YWxpc3QnLCAnbWFzYWknLCAnbWVuJywgJ21pc3Npb24gc3RhZmYnLCAnb3duZXInLCAncGFzc2VuZ2VycycsDQoncGVvcGxlJywgICd0dWdlbiB0cmliZXNtZW4nICwgJ3N0cmFuZ2VyJywgJ3Npa2gnLA0KJ2hlcmQgYm95cycsICdpc2lvbG8gZ2FtZSBzY291dHMnLCAnZmFybSBsYWJvdXInLCAnZmFybWVyJywgJ2V1cm9wZWFuJywgJ2VtcGxveWVyJywNCidlbXBsb3llZScsICdjaXZpbGFuJywnc2hvcGtlZXBlcicgLCAnc3R1ZGVudHMnLCAndGVhY2hlcnMnLA0KJ3R1cmthbmEnLCAndmlnaWxhbnRlcycsICd3b21lbicsICd3b3JrZXJzJywndmlsbGFnZXJzJywgICdsYWJvdXInLCAnbG9jYWwgbGFib3VyJywNCidraWt1eXVzJywgJ2VtYnUnLCAndGlyaWtpIGhvdXNlYm95JywgJ3NhbWJ1cnUnLCAnbWFuYWdlcicsICd3b21hbicsDQondmV0b2ZmaWNlcicsICdtcmhpZ2dpbnMnLCAnbWFzYWkgcGFydHknLCdrdXJpYSB0cmliZXNtZW4nLCdtYW5hZ2VyIG9mIGFraXJhIGVzdGF0ZXMnLA0KJ2t1cmlhIHRyaWJlc21lbicsJ2Noc3RlcGhlbicsJ2FmcmljYW4nLA0KJ2NhdGhvbGljIG1pc3NvbiBzdGFmZicsICdhZnJpY2FuIHN0YWZmJywgJ2FzaWFuIHdvbWVuJywgJ2J1cyBjb25kdWN0b3InLCAnY2hpbGQnLA0KJ2NpdmlsaWFuKGZvb2QgY2FycmllcnMpJywgJ2NpdmlsaWFuKHNjaG9vbG1hc3RlciknLCAnY2l2aWxpYW5zJywNCidjaXZpbGlvbicsICdjb21taXR0ZWUnLCAnY29tbWl0dGVlIG1lbWJlcicsICAnY291cmllcicsJ2VsZGVyJywnZW1idSB0cmFjdG9yIGRyaXZlcicsDQonZW1wbG95ZWVzIG9mIGNsdWInLCdlbmdpbmUgYm95JywnZ2lybCcsJ2dvbGYgY2x1YiBzdGFmZicsJ2hpcyBvd24gaHV0JywNCidob3RlbCBrZWVwZXInLCdob3VzZWJveScsJ2lsbGVnYWwgcmVzaWRlbnRzJywnaW5kaWFuJywnaW50ZXJwcmV0ZXInLCdrZW0nLCdraWtpeXUnLA0KJ2tpa3V5dSBhc3Nlc3NvcicsJ2tpa3V5dSBmYW1pbGllcycsJ2tpa3V5dSBob3VzZWJveScsJ2tpa3V5dSBsYWJvdXJlcicsJ2tpa3l1JywNCidraXJ1YSB2aWxsYWdlJywnbGFib3VyIGxpbmUnLCdsYWJvdXIgbGluZXMnLCdsYWJvdXJlcicsJ2xhYm91cmVycycsDQonbGFib3VyZXMnLCdsYWJvdXJsaW5lJywnbGFib3VycycsJ21hbGVzJywnbWFuJywnbWFyYWdvbGknLCdtYXJhZ29saSBsYWJvdXJlcicsDQonbWFzYWkgZWxkZXJzJywnbWFzYWkgdHJpYmVzbWFuJywnbWVtYmVycyBvZiB0aGUgdGhpa2EgY29tbWl0dGVlJywNCidtbmEgc2VjdGlvbiBsZWFkZXJzJywnbXVuaWNpcGFsIGluc3BlY3RvcnMnLCdub24ga2lrdXl1IGVtcGxveWVlcycsJ3BlcnNvbicsDQoncHJvc3RpdHV0ZXMnLCdwdXJrZSBtYXNhaScsJ3B3ZCBlbXBsb3llZScsJ3JhaWx3YXkgZW1wbG95ZWVzJywNCidzY2hvb2wgbWFzdGVyJywnc2Nob29sIHRlYWNoZXInLCdzaXN0ZXJzIGNvbW1pdHRlZScsJ3NvbWFsaScsJ3N0YWZmJywnc3RyYW5nZXJzJywNCid0YXhpIGRyaXZlcnMnLCd0ZWFjaGVyJywndHJlYXN1cmVycycsDQonaGVhZG1hblxcJ3Mgc29uJywnbm9ydG9uIHRyYWlsbFxcJ3MgbGFib3VyJywnZ29yZG9uXFwncyBsYWJvdXInLCAnZm9vZCBjYXJyaWVycycNCikgPSAnY2l2aWxpYW5zJzsNCg0KYygnJyk9TkENCg0KIg0KDQpyZWdleCA8LSAiXFwufHBhdHJvbHxbMS05XVxccypyZHxbMS05XVxccyp0aCIgIyB3aXRoIHJlZ2V4IHN0YXJ0IHRyeWluZyB0byBnZXQgbW9yZSBvZiB0aGVzZSB0byBhdXRvbWF0aWNhbGx5IG1hcCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgbG90cyBvZiBoYW5kIGNvZGluZ3MNCmV2ZW50cyRpbml0aWF0b3JfY2xlYW4gPC0gZXZlbnRzJGluaXRpYXRvciAlPiUgc3RyX3RyaW0oKSAlPiUgZ3N1YihyZWdleCwgIiIsIC4pDQoNCmV2ZW50cyA8LSBldmVudHMgJT4lDQogIGRwbHlyOjpzZWxlY3QoLW9uZV9vZigiaW5pdGlhdG9yX2NsZWFuXzEiLCAiaW5pdGlhdG9yX2NsZWFuXzIiLCAiaW5pdGlhdG9yX2NsZWFuXzMiKSkgJT4lICMgc2VwYXJhdGUgd2lsbCBjb250aW51ZSB0byBhZGQgY29sdW1ucyBldmVyeSB0aW1lIGl0cyBydW4NCiAgc2VwYXJhdGUoDQogICAgY29sID0gaW5pdGlhdG9yX2NsZWFuLA0KICAgIGludG8gPSBjKCJpbml0aWF0b3JfY2xlYW5fMSIsICJpbml0aWF0b3JfY2xlYW5fMiIsICJpbml0aWF0b3JfY2xlYW5fMyIpLA0KICAgIHNlcCA9ICJhbmR8XFxcXHwvfFxcJnwsIiwgcmVtb3ZlID0gRiwgZXh0cmEgPSAiZHJvcCIsIGZpbGwgPSAicmlnaHQiDQogICkNCg0KZXZlbnRzIDwtIGV2ZW50cyAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipwb2xpY2UuKiIsICJwb2xpY2UiLCAuKSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmd1YXJkLioiLCAiZ3VhcmQiLCAuKSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKnRlcnJvci4qfC4qbWF1IG1hdS4qfC4qZ2FuZy4qIiwgInRlcnJvcmlzdCIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qa3ByLip8LiprIHAgci4qIiwgImtwciIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qa2FyLip8LiprIGEgci4qIiwgImthciIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJpbml0aWF0b3JfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qY295LioiLCAiY295IiwgLikpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipnc3UuKiIsICJnc3UiLCAuKSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKndhdGNoLioiLCAid2F0Y2giLCAuKSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXyIpKSwgZnVucyh0cmltd3MoLikpKQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JQ0KICBtdXRhdGUoaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93ID0gcmVjb2RlKGluaXRpYXRvcl9jbGVhbl8xLCBpbml0aWF0b3JfdGFyZ2V0X21hc3Rlcl9jbGVhbikpICU+JQ0KICBtdXRhdGUoaW5pdGlhdG9yX2NsZWFuXzJfYWdnbG93ID0gcmVjb2RlKGluaXRpYXRvcl9jbGVhbl8yLCBpbml0aWF0b3JfdGFyZ2V0X21hc3Rlcl9jbGVhbikpICU+JQ0KICBtdXRhdGUoaW5pdGlhdG9yX2NsZWFuXzNfYWdnbG93ID0gcmVjb2RlKGluaXRpYXRvcl9jbGVhbl8zLCBpbml0aWF0b3JfdGFyZ2V0X21hc3Rlcl9jbGVhbikpDQoNCiMgc29ydCh0YWJsZShldmVudHMkaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93KSkNCg0KbG93bGV2ZWxhZ2cgPC0gYygNCiAgImFyYWIgY29tYmF0IHVuaXRzIiwgImNpZCIsICJwc3VlZG8gZ2FuZ3MiLCAiYXNpYW4gY29tYmF0IHVuaXRzIiwgInNwZWNpYWwgYnJhbmNoIiwNCiAgInRyaWJhbCBhdXRob3JpdGllcyIsICJ0cmliYWwgcG9saWNlIHJlc2VydmUiLCAicm95YWwgYWlyIGZvcmNlIiwNCiAgInBhcmFtaWxpdGFyeSIsICJrZW55YSByZWdpbWVudCIsICJ0cmliYWwgcG9saWNlIiwgImtlbnlhIHBvbGljZSByZXNlcnZlIiwgImtlbnlhIHBvbGljZSIsDQogICJicml0aXNoIG1pbGl0YXJ5IiwgImNpdmlsaWFucyIsICJLaW5ncyBBZnJpY2FuIFJpZmxlcyIsICJtaWxpdGFyeSAoZ2VuZXJpYykiLCAicG9saWNlIChnZW5lcmljKSIsDQogICJyYWlsd2F5IHBvbGljZSIsICJob21lIGd1YXJkIiwgImNvbG9uaWFsIGF1dGhvcml0aWVzIiwgInN1c3BlY3RlZCBpbnN1cmdlbnRzIg0KKQ0KDQojIGV2ZW50cyA8LSBldmVudHMgJT4lDQojIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fMV9hZ2dsb3c9aWZlbHNlKGluaXRpYXRvcl9jbGVhbl8xX2FnZ2xvdyAgJWluJSBsb3dsZXZlbGFnZyAmICFpcy5uYShpbml0aWF0b3JfY2xlYW5fMV9hZ2dsb3cpLGluaXRpYXRvcl9jbGVhbl8xX2FnZ2xvdywgInVuY2F0ZWdvcml6ZWQiKSkgJT4lIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fMl9hZ2dsb3c9aWZlbHNlKGluaXRpYXRvcl9jbGVhbl8yX2FnZ2xvdyAgJWluJSBsb3dsZXZlbGFnZyAmICFpcy5uYShpbml0aWF0b3JfY2xlYW5fMl9hZ2dsb3cpLGluaXRpYXRvcl9jbGVhbl8yX2FnZ2xvdywgInVuY2F0ZWdvcml6ZWQiKSkgJT4lIG11dGF0ZShpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3c9aWZlbHNlKGluaXRpYXRvcl9jbGVhbl8zX2FnZ2xvdyAgJWluJSBsb3dsZXZlbGFnZyAmICFpcy5uYShpbml0aWF0b3JfY2xlYW5fM19hZ2dsb3cpLGluaXRpYXRvcl9jbGVhbl8zX2FnZ2xvdywgInVuY2F0ZWdvcml6ZWQiKSkNCg0KIyB0YWJsZShldmVudHMkaW5pdGlhdG9yX2NsZWFuXzFfYWdnbG93LCB1c2VOQT0iYWx3YXlzIikNCmBgYA0KDQpgYGB7ciBDb2xsYXBzZSBFdmVudCBJbml0YXRvcnMgTWVkaXVtICxjYWNoZT1UfQ0KDQpldmVudHNbLCBjKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWQiLCAiaW5pdGlhdG9yX2NsZWFuXzJfYWdnbWVkIiwgImluaXRpYXRvcl9jbGVhbl8zX2FnZ21lZCIpXSA8LQ0KICBldmVudHNbLCBjKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2dsb3ciLCAiaW5pdGlhdG9yX2NsZWFuXzJfYWdnbG93IiwgImluaXRpYXRvcl9jbGVhbl8zX2FnZ2xvdyIpXQ0KZXZlbnRzIDwtIGV2ZW50cyAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8xX2FnZ21lZHxpbml0aWF0b3JfY2xlYW5fMl9hZ2dtZWR8aW5pdGlhdG9yX2NsZWFuXzNfYWdnbWVkIikpLA0KICAgIC5mdW5zID0gZnVucyhjYXI6OnJlY29kZSgiDQogICAgIGMoJ2NpZCcsJ2tlbnlhIHBvbGljZSByZXNlcnZlJywna2VueWEgcG9saWNlJywncG9saWNlIChnZW5lcmljKScsJ3JhaWx3YXkgcG9saWNlJywnc3BlY2lhbCBicmFuY2gnLA0KJ3RyaWJhbCBwb2xpY2UnLCd0cmliYWwgcG9saWNlIHJlc2VydmUnKSA9ICdwb2xpY2UnOw0KICAgICBjKCdhcmFiIGNvbWJhdCB1bml0cycsJ2FzaWFuIGNvbWJhdCB1bml0cycsJ2JyaXRpc2ggbWlsaXRhcnknLCdLaW5ncyBBZnJpY2FuIFJpZmxlcycsDQona2VueWEgcmVnaW1lbnQnLCdtaWxpdGFyeSAoZ2VuZXJpYyknLCdwc3VlZG8gZ2FuZ3MnLCdyb3lhbCBhaXIgZm9yY2UnKSA9ICdtaWxpdGFyeSc7IA0KICAgICBjKCdjb2xvbmlhbCBhdXRob3JpdGllcycsICd0cmliYWwgYXV0aG9yaXRpZXMnKT0nY2l2aWwgYXV0aG9yaXRpZXMnDQogICAgICAgICAgIikpDQogICkNCg0KZXZlbnRzJGluaXRpYXRvcl9jbGVhbl8yX2FnZ21lZCAlPiUNCiAgdGFieWwoc29ydCA9IFRSVUUpICU+JQ0KICBhZG9ybl9jcm9zc3RhYihkaWdpdHMgPSAxKQ0KYGBgDQoNCmBgYHtyIENvbGxhcHNlIEV2ZW50IEluaXRhdG9ycyBIaWdoICxjYWNoZT1UfQ0KDQpldmVudHNbLCBjKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2doaWdoIiwgImluaXRpYXRvcl9jbGVhbl8yX2FnZ2hpZ2giLCAiaW5pdGlhdG9yX2NsZWFuXzNfYWdnaGlnaCIpXSA8LQ0KICBldmVudHNbLCBjKCJpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWQiLCAiaW5pdGlhdG9yX2NsZWFuXzJfYWdnbWVkIiwgImluaXRpYXRvcl9jbGVhbl8zX2FnZ21lZCIpXQ0KZXZlbnRzIDwtIGV2ZW50cyAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoc3RhcnRzX3dpdGgoImluaXRpYXRvcl9jbGVhbl8xX2FnZ2hpZ2h8aW5pdGlhdG9yX2NsZWFuXzJfYWdnaGlnaHxpbml0aWF0b3JfY2xlYW5fM19hZ2doaWdoIikpLA0KICAgIC5mdW5zID0gZnVucyhjYXI6OnJlY29kZSgiDQogICAgICAgICAgICAgICAgICBjKCdjaXZpbCBhdXRob3JpdGllcycsICdob21lIGd1YXJkJywgJ21pbGl0YXJ5JywgJ3BvbGljZScsICdwYXJhbWlsaXRhcnknKSA9J2dvdmVybm1lbnQnOw0KICAgICAgICAgICAgICAgICAgYygnc3VzcGVjdGVkIGluc3VyZ2VudHMnKSA9J3JlYmVscyc7DQogICAgICAgICAgIikpDQogICkNCg0KZXZlbnRzJGluaXRpYXRvcl9jbGVhbl8zX2FnZ2hpZ2ggJT4lDQogIHRhYnlsKHNvcnQgPSBUUlVFKSAlPiUNCiAgYWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkNCmBgYA0KDQojIFRhcmdldCBvZiBFdmVudA0KDQpgYGB7ciBUYXJnZXQgb2YgRXZlbnQgTG93LCBjYWNoZT1UfQ0KDQpyZWdleCA8LSAiXFwufHBhdHJvbHxbMS05XVxccypyZHxbMS05XVxccyp0aCIgIyB3aXRoIHJlZ2V4IHN0YXJ0IHRyeWluZyB0byBnZXQgbW9yZSBvZiB0aGVzZSB0byBhdXRvbWF0aWNhbGx5IG1hcCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgbG90cyBvZiBoYW5kIGNvZGluZ3MNCmV2ZW50cyR0YXJnZXRfY2xlYW4gPC0gZXZlbnRzJGluaXRpYXRvciAlPiUgc3RyX3RyaW0oKSAlPiUgdG9sb3dlcigpICU+JSBnc3ViKHJlZ2V4LCAiIiwgLikNCg0KZXZlbnRzIDwtIGV2ZW50cyAlPiUNCiAgZHBseXI6OnNlbGVjdCgtb25lX29mKCJ0YXJnZXRfY2xlYW5fMSIsICJ0YXJnZXRfY2xlYW5fMiIsICJ0YXJnZXRfY2xlYW5fMyIpKSAlPiUgIyBzZXBhcmF0ZSB3aWxsIGNvbnRpbnVlIHRvIGFkZCBjb2x1bW5zIGV2ZXJ5IHRpbWUgaXRzIHJ1bg0KICBzZXBhcmF0ZSgNCiAgICBjb2wgPSBpbml0aWF0b3JfY2xlYW4sDQogICAgaW50byA9IGMoInRhcmdldF9jbGVhbl8xIiwgInRhcmdldF9jbGVhbl8yIiwgInRhcmdldF9jbGVhbl8zIiksDQogICAgc2VwID0gImFuZHxcXFxcfC98XFwmfCwiLCByZW1vdmUgPSBGLCBleHRyYSA9ICJkcm9wIiwgZmlsbCA9ICJyaWdodCINCiAgKQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgidGFyZ2V0X2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKnBvbGljZS4qIiwgInBvbGljZSIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qZ3VhcmQuKiIsICJndWFyZCIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qdGVycm9yLip8LiptYXUgbWF1Lip8LipnYW5nLioiLCAidGVycm9yaXN0IiwgLikpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLiprcHIuKnwuKmsgcCByLioiLCAia3ByIiwgLikpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLiprYXIuKnwuKmsgYSByLioiLCAia2FyIiwgLikpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoInRhcmdldF9jbGVhbl8iKSksIGZ1bnMoZ3N1YigiLipjb3kuKiIsICJjb3kiLCAuKSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgidGFyZ2V0X2NsZWFuXyIpKSwgZnVucyhnc3ViKCIuKmdzdS4qIiwgImdzdSIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKGdzdWIoIi4qd2F0Y2guKiIsICJ3YXRjaCIsIC4pKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJ0YXJnZXRfY2xlYW5fIikpLCBmdW5zKHRyaW13cyguKSkpDQoNCmV2ZW50cyA8LSBldmVudHMgJT4lDQogIG11dGF0ZSh0YXJnZXRfY2xlYW5fMV9hZ2dsb3cgPSByZWNvZGUodGFyZ2V0X2NsZWFuXzEsIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkgJT4lDQogIG11dGF0ZSh0YXJnZXRfY2xlYW5fMl9hZ2dsb3cgPSByZWNvZGUodGFyZ2V0X2NsZWFuXzIsIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkgJT4lDQogIG11dGF0ZSh0YXJnZXRfY2xlYW5fM19hZ2dsb3cgPSByZWNvZGUodGFyZ2V0X2NsZWFuXzMsIGluaXRpYXRvcl90YXJnZXRfbWFzdGVyX2NsZWFuKSkNCg0KbG93bGV2ZWxhZ2cgPC0gYygNCiAgImNodXJjaCIsICJrZW55YSBwb2xpY2UiLCAibWVkaWNpbmUiLCAidHJpYmFsIHBvbGljZSByZXNlcnZlIiwgImRldGFpbmVlcyIsICJrZW55YSByZWdpbWVudCIsICJvdGhlciB3ZWFwb25zIiwNCiAgInBhcmFtaWxpdGFyeSIsICJhbW11bml0aW9uIiwgImNvbW11bml0aWVzIiwgImJyaXRpc2ggbWlsaXRhcnkiLCAibWlsaXRhcnkgKGdlbmVyaWMpIiwgInRyaWJhbCBhdXRob3JpdGllcyIsICJrZW55YSBwb2xpY2UgcmVzZXJ2ZSIsICJ0cmliYWwgcG9saWNlIiwNCiAgIktpbmdzIEFmcmljYW4gUmlmbGVzIiwgImluZnJhc3RydWN0dXJlIiwgInNjaG9vbCIsICJjYXNoIiwgImNvbG9uaWFsIGF1dGhvcml0aWVzIiwgInBvbGljZSAoZ2VuZXJpYykiLCAic3VwcGxpZXMiLCAiZmlyZWFybXMiLCAiZm9vZCIsICJwcml2YXRlIHByb3BlcnR5IiwNCiAgImhvbWUgZ3VhcmQiLCAiY2l2aWxpYW5zIiwgImxpdmVzdG9jayIsICJzdXNwZWN0ZWQgaW5zdXJnZW50cyINCikNCg0KIyBldmVudHMgPC0gZXZlbnRzICU+JQ0KIyBtdXRhdGUodGFyZ2V0X2NsZWFuXzFfYWdnbG93PWlmZWxzZSh0YXJnZXRfY2xlYW5fMV9hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEodGFyZ2V0X2NsZWFuXzFfYWdnbG93KSx0YXJnZXRfY2xlYW5fMV9hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpICU+JSBtdXRhdGUodGFyZ2V0X2NsZWFuXzJfYWdnbG93PWlmZWxzZSh0YXJnZXRfY2xlYW5fMl9hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEodGFyZ2V0X2NsZWFuXzJfYWdnbG93KSx0YXJnZXRfY2xlYW5fMl9hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpICU+JSBtdXRhdGUodGFyZ2V0X2NsZWFuXzNfYWdnbG93PWlmZWxzZSh0YXJnZXRfY2xlYW5fM19hZ2dsb3cgICVpbiUgbG93bGV2ZWxhZ2cgJiAhaXMubmEodGFyZ2V0X2NsZWFuXzNfYWdnbG93KSx0YXJnZXRfY2xlYW5fM19hZ2dsb3csICJ1bmNhdGVnb3JpemVkIikpDQoNCmV2ZW50cyR0YXJnZXRfY2xlYW5fMV9hZ2dsb3cgJT4lDQogIHRhYnlsKHNvcnQgPSBUUlVFKSAlPiUNCiAgYWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkNCmBgYA0KDQoNCmBgYHtyIENvbGxhcHNlIEV2ZW50IFRhcmdldCBNZWRpdW0gLGNhY2hlPVR9DQoNCmV2ZW50c1ssIGMoInRhcmdldF9jbGVhbl8xX2FnZ21lZCIsICJ0YXJnZXRfY2xlYW5fMl9hZ2dtZWQiLCAidGFyZ2V0X2NsZWFuXzNfYWdnbWVkIildIDwtDQogIGV2ZW50c1ssIGMoInRhcmdldF9jbGVhbl8xX2FnZ2xvdyIsICJ0YXJnZXRfY2xlYW5fMl9hZ2dsb3ciLCAidGFyZ2V0X2NsZWFuXzNfYWdnbG93IildDQpldmVudHMgPC0gZXZlbnRzICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycyhzdGFydHNfd2l0aCgiaW5pdGlhdG9yX2NsZWFuXzFfYWdnbWVkfGluaXRpYXRvcl9jbGVhbl8yX2FnZ21lZHxpbml0aWF0b3JfY2xlYW5fM19hZ2dtZWQiKSksDQogICAgLmZ1bnMgPSBmdW5zKGNhcjo6cmVjb2RlKHRlbXAsICINCiAgICAgYygnY2lkJywna2VueWEgcG9saWNlIHJlc2VydmUnLCdrZW55YSBwb2xpY2UnLCdwb2xpY2UgKGdlbmVyaWMpJywncmFpbHdheSBwb2xpY2UnLA0KJ3NwZWNpYWwgYnJhbmNoJywndHJpYmFsIHBvbGljZScsJ3RyaWJhbCBwb2xpY2UgcmVzZXJ2ZScpID0gJ3BvbGljZSc7DQogICAgIGMoJ2FyYWIgY29tYmF0IHVuaXRzJywnYXNpYW4gY29tYmF0IHVuaXRzJywnYnJpdGlzaCBtaWxpdGFyeScsJ0tpbmdzIEFmcmljYW4gUmlmbGVzJywNCidrZW55YSByZWdpbWVudCcsJ21pbGl0YXJ5IChnZW5lcmljKScsJ3BzdWVkbyBnYW5ncycsJ3JveWFsIGFpciBmb3JjZScpID0gJ21pbGl0YXJ5JzsNCiAgICAgYygnY29sb25pYWwgYXV0aG9yaXRpZXMnLCAndHJpYmFsIGF1dGhvcml0aWVzJyk9J2NpdmlsIGF1dGhvcml0aWVzJzsNCiAgICAgYygnYW1tdW5pdGlvbicsJ2ZpcmVhcm1zJywnb3RoZXIgd2VhcG9ucycpPSdhcm1hbWVudHMnOw0KICAgICBjKCdjYXNoJywnZm9vZCcsJ2xpdmVzdG9jaycsJ21lZGljaW5lJywnc3VwcGxpZXMnKT0ncHJvdmlzaW9ucyc7DQogICAgIGMoJ2NodXJjaCcsJ3NjaG9vbCcsJ2luZnJhc3RydWN0dXJlJyk9J3B1YmxpYyBidWlsZGluZ3MnOw0KICAgICAgICAgICIpKQ0KICApDQoNCmV2ZW50cyRpbml0aWF0b3JfY2xlYW5fMV9hZ2dtZWQgJT4lDQogIHRhYnlsKHNvcnQgPSBUUlVFKSAlPiUNCiAgYWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkNCmBgYA0KDQpgYGB7ciBDb2xsYXBzZSBFdmVudCBJbml0YXRvcnMgLGNhY2hlPVR9DQoNCmV2ZW50c1ssIGMoInRhcmdldF9jbGVhbl8xX2FnZ2hpZ2giLCAidGFyZ2V0X2NsZWFuXzJfYWdnaGlnaCIsICJ0YXJnZXRfY2xlYW5fM19hZ2doaWdoIildIDwtDQogIGV2ZW50c1ssIGMoInRhcmdldF9jbGVhbl8xX2FnZ21lZCIsICJ0YXJnZXRfY2xlYW5fMl9hZ2dtZWQiLCAidGFyZ2V0X2NsZWFuXzNfYWdnbWVkIildDQpldmVudHMgPC0gZXZlbnRzICU+JQ0KICBtdXRhdGVfYXQoDQogICAgdmFycyhzdGFydHNfd2l0aCgidGFyZ2V0X2NsZWFuXzFfYWdnaGlnaHx0YXJnZXRfY2xlYW5fMl9hZ2doaWdofHRhcmdldF9jbGVhbl8zX2FnZ2hpZ2giKSksDQogICAgLmZ1bnMgPSBmdW5zKGNhcjo6cmVjb2RlKCINCiAgICAgICAgICAgICAgICAgIGMoJ2NpdmlsIGF1dGhvcml0aWVzJywgJ2hvbWUgZ3VhcmQnLCAnbWlsaXRhcnknLCAncG9saWNlJywgJ3BhcmFtaWxpdGFyeScpID0nZ292ZXJubWVudCc7DQogICAgICAgICAgICAgICAgICBjKCdzdXNwZWN0ZWQgaW5zdXJnZW50cycsJ2RldGFpbmVlcycpID0ncmViZWxzJzsNCiAgICAgICAgICAgICAgICAgIGMoJ2FybWFtZW50cycsJ3ByaXZhdGUgcHJvcGVydHknLCdwcm92aXNpb25zJywncHVibGljIGJ1aWxkaW5ncycpID0ncHJvcGVydHknOw0KICAgICAgICAgICAgICAgICAgYygnY29tbXVuaXRpZXMnLCdjb21tdW5pdGllcycpPSdjaXZpbGlhbnMnOw0KICAgICAgICAgICIpKQ0KICApDQoNCmV2ZW50cyR0YXJnZXRfY2xlYW5fMV9hZ2doaWdoICU+JQ0KICB0YWJ5bChzb3J0ID0gVFJVRSkgJT4lDQogIGFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpDQpgYGANCg0KDQoNCiMjIENvdW50IG9mIEluaXRpYXRvcnMNCg0KSGVscGVyIGZ1bmN0aW9uIGZvciByZWNvZGluZw0KDQpgYGB7ciBSZWNvZGUgSGVscGVyIEZVbmN0aW9uLCByZXN1bHRzPSJhc2lzIn0NCg0KcmVjb2RlckZ1bmMgPC0gZnVuY3Rpb24oZGF0YSwgb2xkdmFsdWUsIG5ld3ZhbHVlKSB7DQogICMgY29udmVydCBhbnkgZmFjdG9ycyB0byBjaGFyYWN0ZXJzDQogIGlmIChpcy5mYWN0b3IoZGF0YSkpIGRhdGEgPC0gYXMuY2hhcmFjdGVyKGRhdGEpDQogIGlmIChpcy5mYWN0b3Iob2xkdmFsdWUpKSBvbGR2YWx1ZSA8LSBhcy5jaGFyYWN0ZXIob2xkdmFsdWUpDQogIGlmIChpcy5mYWN0b3IobmV3dmFsdWUpKSBuZXd2YWx1ZSA8LSBhcy5jaGFyYWN0ZXIobmV3dmFsdWUpDQoNCiAgIyBjcmVhdGUgdGhlIHJldHVybiB2ZWN0b3INCiAgbmV3dmVjIDwtIGRhdGENCiAgIyBwdXQgcmVjb2RlZCB2YWx1ZXMgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHZlY3Rvcg0KICBmb3IgKGkgaW4gdW5pcXVlKG9sZHZhbHVlKSkgbmV3dmVjW2RhdGEgJWluJSBpXSA8LSBuZXd2YWx1ZVtvbGR2YWx1ZSAlaW4lIGldDQogIG5ld3ZlYw0KfQ0KYGBgDQoNCmBgYHtyIENvdW50IG9mIEluaXRpYXRvcnN9DQoNCiMgVGhlc2UgbnVtYmVycyBhcmUgaW1wcm92aXNlZCBhbmQgY2FuIGJlIGNoYW5nZWQNCmFjb3VwbGUgPC0gMg0KYWZldyA8LSAzDQphZ2FuZyA8LSA2DQphZ2FuZ19sYXJnZSA8LSAxMg0KDQpyZWNvZGluZ3MgPC0gYygNCiAgIjEwMCsiLCAiMTAwIiwNCiAgIj8/IiwgIiIsDQogICIxIGJhZyIsICIxIiwNCiAgIjEgYmxhbmtldCIsICIxIiwNCiAgIjEgYnVybnQgZG93biIsICIxIiwNCiAgIjEgY2l2aWxpYW4iLCAiMSIsDQogICIxIGNvdywgNiBzaGVlcCIsICI3IiwNCiAgIjEgY293IiwgIjEiLA0KICAiMSBnb2F0LCBjbG90aGluZyIsICIxIiwNCiAgIjEgZ29hdCIsICIxIiwNCiAgIjEgbG9vdGVkIiwgIjEiLA0KICAiMSBsb290ZWQiLCAiMSIsDQogICIxIG94IiwgIjEiLA0KICAiMSBzaGVlcCBhbmQgY2hpY2tlbnMiLCAiMSIsDQogICIxIHNoZWVwLCBzb21lIGNoaWNrZW5zIiwgIjEiLA0KICAiMSBzaGVlcCIsICIxIiwNCiAgIjEgc2hvdGd1biAsMzAgcm91bmRzIiwgIjMxIiwNCiAgIjEgc2hvdGd1biArIDEwcmRzIiwgIjExIiwNCiAgIjEgc3RlZXIiLCAiMSIsDQogICIxIHZpbGxhZ2UsIDEgbWFya2V0IiwgIjEiLA0KICAiMSB3b3VuZGVkIiwgIjEiLA0KICAiMSB3cmVja2VkIiwgIjEiLA0KICAiMSsiLCAiMSIsDQogICIxKzMiLCAiNCIsDQogICIxK3NvbWUiLCAiMSIsDQogICIxMCBhY3JlcyIsICIxMCIsDQogICIxMCBiYWdzIiwgIjEwIiwNCiAgIjEwIGNhdHRsZSIsICIxMCIsDQogICIxMCBzYWNrcyIsICIxMCIsDQogICIxMCB0byAxMiIsICIxMSIsDQogICIxMCB0byAxNSIsICIxMyIsDQogICIxMC8xNC8yMDEzIiwgIiIsDQogICIxMC8xNS8yMDEzIiwgIiIsDQogICIxMC8yMC8yMDEzIiwgIiIsDQogICIxMDAgbGIiLCAiMTAwIiwNCiAgIjEwMC0xMzAiLCAiMTE1IiwNCiAgIjEwMC0xNTAiLCAiMTI1IiwNCiAgIjEwMCsiLCAxMDAsDQogICIxMDAwMCIsICIiLA0KICAiMTA5IGNhdHRsZSIsICIxMDkiLA0KICAiMTBiYWdzIHBvdGF0b2VzIiwgIjEwIiwNCiAgIjExIGNhdHRsZSIsICIxMSIsDQogICIxMSBzaGVlcCIsICIxMSIsDQogICIxMTIgYm9yZSAmIDIwLjEuNDUgJjcgcmRzIiwgIjExMiIsDQogICIxMiBiYWdzIiwgIjEyIiwNCiAgIjEyIGNhdHRsZSIsICIxMiIsDQogICIxMiBnb2F0cyIsICIxMiIsDQogICIxMiB0byAxNSIsICIxMyIsDQogICIxMiB0byAyMCIsICIxNyIsDQogICIxMi8xNC8yMDEzIiwgIiIsDQogICIxMjAgY2F0dGxlIiwgIjEyMCIsDQogICIxMjArMSIsICIxMjEiLA0KICAiMTMgc2hlZXAiLCAiMTMiLA0KICAiMTMtMTUiLCAiMTQiLA0KICAiMTMwMCB3b3J0aCIsICIxMzAwIiwNCiAgIjE0IGNhdHRsZSIsICIxNCIsDQogICIxNCBnb2F0cyIsICIxNCIsDQogICIxNCBoZWFkIiwgIjE0IiwNCiAgIjE0KyIsICIxNCIsDQogICIxNSAtIDIwIiwgIjE4IiwNCiAgIjE1IGNhdHRsZSIsICIxNSIsDQogICIxNSB0byAyMCIsICIxNyIsDQogICIxNSB0byAyMCIsICIxNyIsDQogICIxNSB0byAyNSIsICIyMCIsDQogICIxNS0yMCIsICIxNyIsDQogICIxNSsiLCAiMTUiLA0KICAiMTUwLTIwMCIsICIxNzUiLA0KICAiMTUwKyIsICIxNTAiLA0KICAiMTUxIGNhdHRsZSIsICIxNTEiLA0KICAiMTcgY2F0dGxlIiwgIjE3IiwNCiAgIjE3MiBiYWdzIGJ1cm50IiwgIjE3MiIsDQogICIxOCBjYXR0bGUiLCAiMTgiLA0KICAiMTkgYmFncyIsICIxOSIsDQogICIxOTYgcm91bmRzIiwgIjE5NiIsDQogICIyIGJhZ3MgbWFpemUiLCAiMiIsDQogICIyIGJhZ3MiLCAiMiIsDQogICIyIGJhZ3MiLCAiMiIsDQogICIyIGJ1Y2tldHMiLCAiMiIsDQogICIyIGNhdHRsZSBoYW1zdHJ1bmciLCAiMiIsDQogICIyIGNhdHRsZSwgY29ybiIsICIzIiwNCiAgIjIgY2F0dGxlIiwgIjIiLA0KICAiMiBjb3dzIiwgIjIiLA0KICAiMiBkZWJiaWVzIiwgIjIiLA0KICAiMiBnb2F0cyIsICIyIiwNCiAgIjIgZ3JvdXBzIiwgIjIiLA0KICAiMiBodXRzIGJ1cm50IiwgIjIiLA0KICAiMiBzaGVlcCIsICIyIiwNCiAgIjIgd2F0Y2hlcywgY2FzaCIsICIyIiwNCiAgIjIvMy8yMDEzIiwgIiIsDQogICIyKyIsICIyIiwNCiAgIjIwIGJhZ3MgbWFpemUsIDkgZ29hdHMsIDMyIGNoaWNrZW5zIGFuZCBkdWNrcywgY2FzaCIsICI2MCIsDQogICIyMCBiYWdzIiwgIjIwIiwNCiAgIjIwIGNhdHRsZSIsICIyMCIsDQogICIyMCBnb2F0cyIsICIyMCIsDQogICIyMCBzaGVlcCIsICIyMCIsDQogICIyMCB0byAyNSIsICIyMyIsDQogICIyMCB0byAzMCIsICIyNSIsDQogICIyMCB0byA0MCIsICIzMCIsDQogICIyMC0yNSIsICIyMyIsDQogICIyMC0zMCIsICIyNSIsDQogICIyMC0zNSIsICIzMCIsDQogICIyMC01MCIsICIzNSIsDQogICIyMC8zMCIsICIyNSIsDQogICIyMC8zMCIsICIyNSIsDQogICIyMCsiLCAiMjAiLA0KICAiMjAwIHlkcyIsICIyMDAiLA0KICAiMjAwLTMwMCIsICIyNTAiLA0KICAiMjAwKyIsICIyMDAiLA0KICAiMjAwMCBhY3JlcyIsICIyMDAwIiwNCiAgIjIxIGdvYXRzIiwgIjIxIiwNCiAgIjIxIGhlYWQiLCAiMjEiLA0KICAiMjIgY2F0dGxlIiwgIjIyIiwNCiAgIjI1IHRvIDMwIiwgIjI4IiwNCiAgIjI1LTMwIiwgIjI3IiwNCiAgIjI1LTMwIiwgIjI3IiwNCiAgIjI4IGtpbGxlZCIsICIyOCIsDQogICIyOCBzaGVlcCIsICIyOCIsDQogICIzIGJhZ3MiLCAiMyIsDQogICIzIGJhZ3MiLCAiMyIsDQogICIzIGJpa2VzIiwgIjMiLA0KICAiMyBjYXR0bGUiLCAiMyIsDQogICIzIGNhdHRsZSIsICIzIiwNCiAgIjMgZ29hdHMiLCAiMyIsDQogICIzIG9yIDQiLCAiMyIsDQogICIzIG9yIDQiLCAiMyIsDQogICIzIHBhbmdhcyIsICIzIiwNCiAgIjMgc2hlZXAsIDIgY2FsdmVzIiwgIjUiLA0KICAiMyBzaGVlcCIsICIzIiwNCiAgIjMgdG8gNCIsICIzIiwNCiAgIjMgdG8gNCIsICIzIiwNCiAgIjMvMTAvMjAxMyIsICIiLA0KICAiMy80LzIwMTMiLCAiIiwNCiAgIjMvNS8yMDEzIiwgIiIsDQogICIzLzYvMjAxMyIsICIiLA0KICAiMysiLCAiMyIsDQogICIzKzMrMSsyIiwgIjkiLA0KICAiMytzb21lIiwgIjMiLA0KICAiMzAgYWNyZXMiLCAiMzAiLA0KICAiMzAgY2F0dGxlIiwgIjMwIiwNCiAgIjMwIHRvIDQwIiwgIjM1IiwNCiAgIjMwLTM1IiwgIjMzIiwNCiAgIjMwLTQwIiwgIjM1IiwNCiAgIjMwLTUwIiwgIjQwIiwNCiAgIjMwKyIsICIzMCIsDQogICIzMDAtNDAwIiwgIjM1MCIsDQogICIzMDArIiwgIjMwMCIsDQogICIzNSBiYWdzIiwgIjM1IiwNCiAgIjM1IHRvIDQwIiwgIjM3IiwNCiAgIjM4IGNhdHRsZSIsICIzOCIsDQogICIzb3IgNCIsICIzIiwNCiAgIjQgYmFncyBwb3RhdG9lcyIsICI0IiwNCiAgIjQgYmFncyIsICI0IiwNCiAgIjQgZ29hdHMiLCAiNCIsDQogICI0IGdyb3VwcyIsICIiLA0KICAiNCBvciA1IiwgIjQiLA0KICAiNCBveGVuIiwgIjQiLA0KICAiNCBzaGVlcCIsICI0IiwNCiAgIjQgdG8gOCIsICI2IiwNCiAgIjQvNi8yMDEzIiwgIiIsDQogICI0MCBiYWciLCAiNDAiLA0KICAiNDAgY2F0dGxlIiwgIjQwIiwNCiAgIjQwIHNhY2tzIiwgIjQwIiwNCiAgIjQwIHNoZWVwIiwgIjQwIiwNCiAgIjQwIHRvIDUwIiwgIjQ1IiwNCiAgIjQwLzUwIiwgIjQ1IiwNCiAgIjQwMCBjYXR0bGUiLCAiNDAwIiwNCiAgIjQwMDAiLCAiIiwNCiAgIjQ0IGNhdHRsZSIsICI0NCIsDQogICI1IGJhZ3MiLCAiNSIsDQogICI1IGNhbHZlcyIsICI1IiwNCiAgIjUgY2F0dGxlIiwgIjUiLA0KICAiNSBkZXN0cm95ZWQiLCAiNSIsDQogICI1IGdvYXRzIiwgIjUiLA0KICAiNSBraWxsZWQiLCAiNSIsDQogICI1IG9yIDYiLCAiNSIsDQogICI1IHNoZWVwLCAxIG94IiwgIjYiLA0KICAiNSBzaGVlcCIsICI1IiwNCiAgIjUgdG8gNiIsICI1IiwNCiAgIjUvMTAvMjAxMyIsICIiLA0KICAiNS82LzIwMTMiLCAiIiwNCiAgIjUwIGNhdHRsZSIsICI1MCIsDQogICI1MCB0byA2MCIsICI1NSIsDQogICI1MC0xMDAiLCAiNzUiLA0KICAiNTAtNjAiLCAiNTUiLA0KICAiNTAtNzUiLCAiNjIiLA0KICAiNTArIiwgIjUwIiwNCiAgIjUwKyIsICI1MCIsDQogICI1MDAwIGFjcmVzIiwgIjUwMDAiLA0KICAiNTE5ICsiLCAiNTE5IiwNCiAgIjUzIGRldGFpbmVkIiwgIjUzIiwNCiAgIjU0IHNoZWVwIGFuZCBnb2F0cyIsICI1NCIsDQogICI1NiBjb21taXR0ZWUgbWVtYmVycyIsICI1NiIsDQogICI2IGJhZyIsICI2IiwNCiAgIjYgYmFncyIsICI2IiwNCiAgIjYgY2F0dGxlIiwgIjYiLA0KICAiNiBjYXR0bGUiLCAiNiIsDQogICI2IGdvYXRzIiwgIjYiLA0KICAiNiBvciA3IiwgIjYiLA0KICAiNiBzaGVlcCBhbmQgZ29hdHMiLCAiNiIsDQogICI2IHNoZWVwIiwgIjYiLA0KICAiNiB0byA3IiwgIjYiLA0KICAiNiB0byA4IiwgIjciLA0KICAiNiB0byA5IiwgIjgiLA0KICAiNi04IG1hbiIsICI3IiwNCiAgIjYvMTAvMjAxMyIsICIiLA0KICAiNi84LzIwMTMiLCAiIiwNCiAgIjYwLTEwMCIsICI4MCIsDQogICI2MC03MCIsICI2NSIsDQogICI2NCBjYXR0bGUiLCAiNjQiLA0KICAiNyBiYWdzIiwgIjciLA0KICAiNyBjYXR0bGUiLCAiNyIsDQogICI3IHNoZWVwIiwgIjciLA0KICAiNy8xMC8yMDEzIiwgIiIsDQogICI3MCBiYWdzIiwgIjcwIiwNCiAgIjcwIGNhdHRsZSwgc2hlZXAiLCAiNzAiLA0KICAiNzAtMTAwIiwgIjg1IiwNCiAgIjcwMDAwIiwgIiIsDQogICI3NSByb3VuZHMiLCAiNzUiLA0KICAiOCBiYWdzIHBvdGF0b2VzIiwgIjgiLA0KICAiOCBjYXR0bGUiLCAiOCIsDQogICI4IGNvd3Mgc2xhc2hlZCIsICI4IiwNCiAgIjggY293cyIsICI4IiwNCiAgIjggc2hlZXAiLCAiOCIsDQogICI4IHRvIDEwIiwgIjkiLA0KICAiOC8xMC8yMDEzIiwgIiIsDQogICI4MCBjYXR0bGUiLCAiODAiLA0KICAiODAtMTAwIiwgIjkwIiwNCiAgIjg0IHNoZWVwLCAxIGNvdywgNSBjaGlja2VucyIsICI5MCIsDQogICI5IGNhdHRsZSIsICI5IiwNCiAgIjkgc2hlZXAiLCAiOSIsDQogICI5IHRvIDEwIiwgIjkiLA0KICAiOSs5IiwgIjE4IiwNCiAgIjkwMChub3QgY2xlYXIpIiwgIjkwMCIsDQogICJhbGwgbG9jYWxzIiwgIiIsDQogICJhbGwiLCAiIiwNCiAgImFwcCA1IiwgIjUiLA0KICAiYXBwLiAxMDAiLCAiMTAwIiwNCiAgImFwcC4gMTIwIiwgIjEyMCIsDQogICJhcm1lZCBnYW5nIiwgYWdhbmcsDQogICJiYW5kIiwgYWdhbmcsDQogICJiYW5kcyIsICIiLA0KICAiY2F0dGxlIHNsYXNoaW5nIiwgIiIsDQogICJjbG90aGluZyIsICIiLA0KICAiY29uc2lkZXJhYmxlIHF1YW50aXR5IiwgIiIsDQogICJmYWlybHkgbGFyZ2UgZ2FuZyIsIGFnYW5nX2xhcmdlLA0KICAiZmV3IGJhZ3MiLCAiIiwNCiAgImZldyIsICIiLA0KICAiZm9vZCIsICIiLA0KICAiZ2FuZyIsIGFnYW5nLA0KICAiZ2FuZ3MiLCBhZ2FuZ19sYXJnZSwNCiAgImd1YXJkcyIsIGFmZXcsDQogICJoYWxmIHZpbGxhZ2UiLCAiIiwNCiAgImxhYm91ciIsICIiLA0KICAibGFyZ2UgY3Jvd2QiLCAiIiwNCiAgImxhcmdlIGZvcmNlIiwgYWdhbmdfbGFyZ2UsDQogICJsYXJnZSBnYW5nIiwgYWdhbmdfbGFyZ2UsDQogICJsYXJnZSBtZWV0aW5nIiwgIiIsDQogICJsYXJnZSBudW1iZXIiLCAiIiwNCiAgImxhcmdlIG51bWJlcnMiLCAiIiwNCiAgImxhcmdlIHF1YW50aXRpZXMiLCAiIiwNCiAgImxhcmdlIHF1YW50aXR5IiwgIiIsDQogICJsYXJnZSByZS1vYXRoaW5nIGNlcmVtb255IiwgIiIsDQogICJsYXJnZSBzY2FsZSIsICIiLA0KICAibGFyZ2UiLCBhZ2FuZ19sYXJnZSwNCiAgImxhcmdpc2ggZ2FuZyIsIGFnYW5nX2xhcmdlLA0KICAibG9jYWwgcG9wdWxhY2UiLCAiIiwNCiAgIm1hbnkgdGhvdXNhbmQiLCAiMjAwMCIsDQogICJtb2IiLCAiIiwNCiAgIm5vdCBnaXZlbiIsICIiLA0KICAibnVtYmVyIiwgIiIsDQogICJvY2N1cGFudHMiLCAiIiwNCiAgIm92ZXIgMjAwIiwgIjIwMCIsDQogICJwYXJ0eSIsICIiLA0KICAicGFydHkiLCBhZ2FuZywNCiAgInBhdHJvbCIsIGFnYW5nLA0KICAicG9zaG8iLCAiIiwNCiAgInBvdGF0b2VzIiwgIiIsDQogICJxdWFudGl0eSBvZiBjbG90aGluZyIsICIiLA0KICAic2VjdGlvbiIsICIiLA0KICAic2V2ZXJhbCBnYW5ncyIsICJhZ2FuZ19sYXJnZSIsDQogICJzZXZlcmFsIiwgIjMiLA0KICAic2hlZXAgYW5kIGdvYXRzIiwgIiIsDQogICJzaHMgMiwzMDAvLSIsICIyMzAwIiwNCiAgInNocyA2MC8tIiwgIjYwIiwNCiAgInNocy4gMSwwMDAiLCAiMTAwMCIsDQogICJzaHMuIDE4IiwgIjE4IiwNCiAgInNocy4gMzAiLCAiMzAiLA0KICAic21hbGwgZ2FuZyIsIGFnYW5nLA0KICAic21hbGwgZ2FuZ3MiLCAiYWdhbmciLA0KICAic21hbGwgZ3JvdXAiLCBhZ2FuZywNCiAgInNtYWxsIHBhcnR5IiwgYWZldywNCiAgInNtYWxsIiwgYWdhbmcsDQogICJzb21lIiwgYWZldywNCiAgInN1ZmZpY2llbnQgZm9vZCIsICIiLA0KICAidW5rbm93biIsICIiLA0KICAidmVyeSBsYXJnZSBnYW5nIiwgImFnYW5nX2xhcmdlIiwNCiAgInZpbGxhZ2VzIGluIG5kaWEsIGdpY2h1Z3UsIGVtYnUgZGl2aXNpb25zIiwgIiIsDQogICJ3aXZlcyIsICIiDQopDQpyZWNvZGluZ3MgPC0gbWF0cml4KHJlY29kaW5ncywgbmNvbCA9IDIsIGJ5cm93ID0gVCkNCg0KZXZlbnRzJGluaXRpYXRvcl9udW1iZXJzX251bWVyaWMgPC0gZXZlbnRzJGluaXRpYXRvcl9udW1iZXJzICU+JSByZWNvZGVyRnVuYyguLCByZWNvZGluZ3NbLCAxXSwgcmVjb2RpbmdzWywgMl0pICU+JSBhcy5udW1lcmljKCkNCmV2ZW50cyR0YXJnZXRfbnVtYmVyc19udW1lcmljIDwtIGV2ZW50cyR0YXJnZXRfbnVtYmVycyAlPiUgcmVjb2RlckZ1bmMoLiwgcmVjb2RpbmdzWywgMV0sIHJlY29kaW5nc1ssIDJdKSAlPiUgYXMubnVtZXJpYygpDQpldmVudHMkYWZmZWN0ZWRfY291bnRfbnVtZXJpYyA8LSBldmVudHMkYWZmZWN0ZWRfY291bnQgJT4lIHJlY29kZXJGdW5jKC4sIHJlY29kaW5nc1ssIDFdLCByZWNvZGluZ3NbLCAyXSkgJT4lIGFzLm51bWVyaWMoKQ0KYGBgDQoNCiMgQ2FzdWFsdGllcw0KDQpgYGB7ciBDYXN1YWx0aWVzLCByZXN1bHRzPSJhc2lzIn0NCg0KZXZlbnRzWywgYygNCiAgImdvdmVybm1lbnRfa2lsbGVkX2NsZWFuIiwgImdvdmVybm1lbnRfd291bmRlZF9jbGVhbiIsICJnb3Zlcm5tZW50X2NhcHR1cmVkX2NsZWFuIiwNCiAgInJlYmVsc19raWxsZWRfY2xlYW4iLCAicmViZWxzX3dvdW5kZWRfY2xlYW4iLCAicmViZWxzX2NhcHR1cmVkX2NsZWFuIiwNCiAgImNpdmlsaWFuc19raWxsZWRfY2xlYW4iLCAiY2l2aWxpYW5zX3dvdW5kZWRfY2xlYW4iLCAiY2l2aWxpYW5zX2NhcHR1cmVkX2NsZWFuIg0KKV0gPC0NCiAgZXZlbnRzWywgYygNCiAgICAiZ292ZXJubWVudF9raWxsZWQiLCAiZ292ZXJubWVudF93b3VuZGVkIiwgImdvdmVybm1lbnRfY2FwdHVyZWQiLA0KICAgICJyZWJlbHNfa2lsbGVkIiwgInJlYmVsc193b3VuZGVkIiwgInJlYmVsc19jYXB0dXJlZCIsDQogICAgImNpdmlsaWFuc19raWxsZWQiLCAiY2l2aWxpYW5zX3dvdW5kZWQiLCAiY2l2aWxpYW5zX2NhcHR1cmVkIg0KICApXQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JSBtdXRhdGVfYXQoDQogIC52YXJzID0gYygNCiAgICAiZ292ZXJubWVudF9raWxsZWRfY2xlYW4iLCAiZ292ZXJubWVudF93b3VuZGVkX2NsZWFuIiwgImdvdmVybm1lbnRfY2FwdHVyZWRfY2xlYW4iLA0KICAgICJyZWJlbHNfa2lsbGVkX2NsZWFuIiwgInJlYmVsc193b3VuZGVkX2NsZWFuIiwgInJlYmVsc19jYXB0dXJlZF9jbGVhbiIsDQogICAgImNpdmlsaWFuc19raWxsZWRfY2xlYW4iLCAiY2l2aWxpYW5zX3dvdW5kZWRfY2xlYW4iLCAiY2l2aWxpYW5zX2NhcHR1cmVkX2NsZWFuIg0KICApLA0KICBmdW5zKGFzLm51bWVyaWMoY2FyOjpyZWNvZGUoLiwgIiAnRmV3Jz0nMic7J01hbnknPSczJzsnb3RoZXJzJz0nMic7J1NldmFyYWwnPSczJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V2ZXJhbCc9JzMnOyAnU2V2ZXJhbCBNb3JlJz0nMyc7ICdTZXZlcmFsIG90aGVycyc9JzMnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU29tZSc9JzMnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAwKyc9JzEwMCc7ICcyMyBGYW1pbGllcyc9JzIzJzsgJzI4IGZhbWlsaWVzJz0nMjgnOyAnMzAtNDAnPSczNSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1MCsnPSc1MCc7ICdDb3VuY2lsIG9mIGVsZGVycyc9JzMnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb3VuY2lsIG9mIHdhcic9JzMnOyAnRmV3Jz0nMic7ICdzb21lJz0nMic7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2V2ZXJhbCc9JzMnOyAgJzQ1MDAnPSc0NSc7ICc4MDAnPSc4MCc7ICdHYW5nJz0nMyc7ICdNYWpvcml0eSc9JzMnOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgJ21hbnknPSczJyAgOyAnU2V2ZXJhbCc9JzMnIDsgJ1NtYWxsIGdhbmcnPSczJyA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzYrJz0nNicgOyAnMTArJz0nMTAnIDsgJzMrJz0nMyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5Lbm93bic9JzEnOyAndW5rbm93bic9JzEnOyAnVW5Lbm93bic9JzEnOyAgJ1VOS05PV04nPScxJzsgJ1Vua293bic9JzEnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nPScxJyA7ICdOdW1iZXInPScxJzsnTW9yZSc9JzEnOyAnMTAxOTcnPScnIDsgJzEwMSc9JzEnIDsNCic0OCc9JzcnIDsgJzE0Nic9JzEnIDsgJzEyMic9JzEnOyAgJzIwOCc9JzEnOyAnOTQnPScxJyA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQT0wIikpKQ0KKQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JSBtdXRhdGVfYXQoLnZhcnMgPSBjKA0KICAiZ292ZXJubWVudF9raWxsZWRfY2xlYW4iLCAiZ292ZXJubWVudF93b3VuZGVkX2NsZWFuIiwgImdvdmVybm1lbnRfY2FwdHVyZWRfY2xlYW4iLA0KICAicmViZWxzX2tpbGxlZF9jbGVhbiIsICJyZWJlbHNfd291bmRlZF9jbGVhbiIsICJyZWJlbHNfY2FwdHVyZWRfY2xlYW4iLA0KICAiY2l2aWxpYW5zX2tpbGxlZF9jbGVhbiIsICJjaXZpbGlhbnNfd291bmRlZF9jbGVhbiIsICJjaXZpbGlhbnNfY2FwdHVyZWRfY2xlYW4iDQopLCBmdW5zKGFzLm51bWVyaWMpKQ0KDQpldmVudHMgPC0gZXZlbnRzICU+JQ0KICBtdXRhdGUocmViZWxzX2tpbGxlZHdvdW5kZWRfY2xlYW4gPSByZWJlbHNfa2lsbGVkX2NsZWFuICsgcmViZWxzX3dvdW5kZWRfY2xlYW4pICU+JQ0KICBtdXRhdGUoZ292ZXJubWVudF9raWxsZWRfd291bmRlZF9jbGVhbiA9IGdvdmVybm1lbnRfa2lsbGVkX2NsZWFuICsgZ292ZXJubWVudF93b3VuZGVkX2NsZWFuKSAlPiUNCiAgbXV0YXRlKHJlYmVsc19nb3Zlcm5tZW50X2tpbGxlZHdvdW5kZWRfY2xlYW4gPSByZWJlbHNfa2lsbGVkX2NsZWFuICsgcmViZWxzX3dvdW5kZWRfY2xlYW4pICU+JQ0KICBtdXRhdGUocmViZWxzX2dvdmVybm1lbnRfa2lsbGVkX2NsZWFuID0gcmViZWxzX2tpbGxlZF9jbGVhbiArIGdvdmVybm1lbnRfa2lsbGVkX2NsZWFuKSAlPiUNCiAgbXV0YXRlKHJlYmVsc19nb3Zlcm5tZW50X2NpdmlsaWFuc19raWxsZWRfY2xlYW4gPSByZWJlbHNfa2lsbGVkX2NsZWFuICsgZ292ZXJubWVudF9raWxsZWRfY2xlYW4gKyBjaXZpbGlhbnNfa2lsbGVkX2NsZWFuKQ0KYGBgDQoNCmBgYHtyIENvbGxhcHNlIEV2ZW50IFR5cGVzLGNhY2hlPVR9DQoNCmV2ZW50cyAlPiUgY3Jvc3N0YWIoaW5pdGlhdG9yX2NsZWFuXzFfYWdnaGlnaCwgdHlwZV9jbGVhbl9hZ2doaWdoKSAlPiUgYWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkNCmV2ZW50cyAlPiUgY3Jvc3N0YWIodGFyZ2V0X2NsZWFuXzFfYWdnaGlnaCwgdHlwZV9jbGVhbl9hZ2doaWdoKSAlPiUgYWRvcm5fY3Jvc3N0YWIoZGlnaXRzID0gMSkNCmV2ZW50cyAlPiUgY3Jvc3N0YWIodGFyZ2V0X2NsZWFuXzFfYWdnaGlnaCwgaW5pdGlhdG9yX2NsZWFuXzFfYWdnaGlnaCkgJT4lIGFkb3JuX2Nyb3NzdGFiKGRpZ2l0cyA9IDEpDQpgYGANCg0KDQojIE91dHB1dCBDbGVhbmVkIEZpbGUNCg0KYGBge3J9DQpwcmludChnbHVlKGdldHdkKCksICIvaW5zdC9leHRkYXRhL01lYXN1cmluZ0xhbmRzY2FwZUNpdmlsV2FyX2V2ZW50c19jbGVhbmVkLlJkYXRhIikpDQpzYXZlUkRTKGV2ZW50cywgZ2x1ZShnZXR3ZCgpLCAiLy4uL2luc3QvZXh0ZGF0YS9NZWFzdXJpbmdMYW5kc2NhcGVDaXZpbFdhcl9ldmVudHNfY2xlYW5lZC5SZGF0YSIpKQ0KDQpgYGANCg0K